gpt4 book ai didi

c# - 如何在不读取结束的情况下中止来自 WCF 服务的流?

转载 作者:可可西里 更新时间:2023-11-01 03:02:30 24 4
gpt4 key购买 nike

这是我上周一直在调查的问题,但找不到任何解决方案。发现有相同问题但从未得到答案的帖子,希望这对其他人也有帮助。

我有一个 WCF返回包含 stream 的对象的服务在里面。我用 basicHttpBinding使用流传输和 Mtom 将其发送到客户端。

客户端调用 WCF服务并在收到响应对象后立即关闭代理。

接下来,客户端读取它从 WCF 服务获得的流并将其写入本地磁盘上的文件。所有这一切都很好。

我的问题是当客户端想要中止操作并停止从 WCF 服务下载数据时。如果我调用 .close()在流中,例如:serverReply.DataStream.Close();然后它会阻止并从 WCF 服务读取整个流,直到结束,然后再继续。流可能非常大,网络并不总是很快。

这对于网络资源的使用来说是非常不希望的,这基本上是浪费在不再使用的数据上。自 basicHttpBinding仅允许到 WCF 服务服务器的两个并发 TCP 连接(默认情况下),它会阻止其他连接尝试,直到流被读取到结束为止。

我可以增加并发连接的数量,但这将是一个糟糕的解决方案,因为它会带来麻烦。

比如20个aborted downloads还在下载数据扔掉。我需要完全停止传输。

在客户端,流对象只是一个普通的 Stream类,所以它只有 close 方法,没有别的。

调用 .close().abort()在代理对象上没有帮助,使用 .dispose() 销毁它也没有帮助或任何其他方法。在服务器端,我处理 OperationContext.OperationCompleted事件,但直到来自 stream 的数据才会被触发一直读到最后。

所以问题是,如何在不完全读取流的情况下关闭/中止流?

最佳答案

经过调查,我发现 WCF 客户端会一直从流中读取数据,直到 closeTimeout 超时,然后它会中止连接。您可以减少客户端上的 closeTimeout 以尽量减少问题。

注意:您应该将处理流的代码包装到 try/catch block 中。 stream.Dispose() 方法将抛出 TimeoutException,这会打破 not throwing exceptions in Dispose method 的规则。 .

关于c# - 如何在不读取结束的情况下中止来自 WCF 服务的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11710081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com