Yev*_*Yev 17 c# wcf mtom stream wshttpbinding
这是我上周一直在调查的问题,无法找到任何解决方案.发现帖子问同样但从未得到答案,希望这也会帮助其他人.
我有一个WCF服务,返回一个包含stream内部对象的服务.我使用basicHttpBinding流式传输和Mtom将其发送给客户端.
客户端WCF在收到响应对象后立即调用服务并关闭代理.
接下来,客户端读取从WCF服务获取的流并将其写入本地磁盘上的文件.所有这一切都很好.
我的问题是客户端想要中止操作并停止从WCF服务下载数据.如果我.close()在流上调用,例如:serverReply.DataStream.Close();那么它会阻塞并从WCF服务读取整个流,直到它结束,然后再继续.流可能非常大,网络并不总是很快.
这对于网络资源使用都是非常不合需要的,这基本上浪费在不再使用的数据上.并且由于basicHttpBinding只允许两个并发TCP连接(默认情况下)到WCF服务服务器,因此它会阻止其他连接尝试,直到读取流直到结束.
我可以增加并发连接的数量,但这将是一个糟糕的解决方案,因为它会创建一个麻烦的开放.
例如,20个中止的下载仍在下载数据以将其丢弃.我需要完全停止转移.
在客户端上,流对象只是一个常规Stream类,因此它只有close方法,没有别的.
调用.close()或.abort()代理对象没有帮助,也没有使用.dispose()或任何其他方法销毁它.在服务器端,我处理OperationContext.OperationCompleted事件,但是直到stream读取数据直到结束才会触发.
所以问题是,如何在不完全读取流的情况下关闭/中止流?
你尝试过玩弄吗binding.MaxBufferSize?
您是否尝试过使用 app.config 文件设置,例如:
<bindings>
<wsHttpBinding>
<binding name="default" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" >
<readerQuotas maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384"
maxDepth="64" maxStringContentLength="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
我会尽量减少超时和缓冲区长度,并尝试中止或关闭,看看会发生什么。
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |