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