这是我上周一直在调查的问题,但找不到任何解决方案。发现帖子问同样的问题,但从未得到答案,希望这对其他人也有帮助。
我有一个WCF
服务,它返回一个包含 a 的对象stream
。我使用basicHttpBinding
流传输和 Mtom 将其发送到客户端。
WCF
客户端在收到响应对象后立即调用服务并关闭代理。
接下来,客户端读取从 WCF 服务获得的流并将其写入本地磁盘上的文件。所有这一切都很好。
我的问题是当客户端想要中止操作并停止从 WCF 服务下载数据时。如果我调用.close()
流,例如:serverReply.DataStream.Close();
然后它会阻塞并从 WCF 服务读取整个流,直到它结束,然后再继续。流可能非常大,网络并不总是很快。
这对于网络资源的使用都是非常不利的,这基本上浪费在不再使用的数据上。并且由于basicHttpBinding
只允许到 WCF 服务服务器的两个并发 TCP 连接(默认情况下),它会阻止其他连接尝试,直到流被读取直到结束。
我可以增加并发连接的数量,但这将是一个糟糕的解决方案,因为它会造成麻烦。
例如,20 个中止的下载仍在下载数据以将其丢弃。我需要完全停止传输。
在客户端,流对象只是一个普通的Stream
类,所以它只有 close 方法,没有别的。
调用.close()
或.abort()
代理对象没有帮助,使用.dispose()
或任何其他方法破坏它也无济于事。在服务器端,我处理该OperationContext.OperationCompleted
事件,但直到从 数据stream
读取到最后才会触发它。
所以问题是,我如何在不完全阅读的情况下关闭/中止流?