- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是我上周一直在调查的问题,但找不到任何解决方案。发现有相同问题但从未得到答案的帖子,希望这对其他人也有帮助。
我有一个 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/
我是一名优秀的程序员,十分优秀!