最近刚接触WCF,在项目中采用NetTcpBinding绑定运用流模式传输文件过程中,出现“套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致”这个错误,上网查找了很久也没能很好的解决,一般的解决方案都是更换一种绑定协议,比如WSHttpBinding或者basicHttpBinding。可是由于实际情况又不能随意更换绑定协议,而且更换协议后出现其他的问题,所以一直不甘心。后来在博客园的一个博问中看到一个启发(具体是哪个提问现在已经找不到了,但是是受了dudu老大的启发),就是在App.config配置文件中,添加如下配置:
<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true"> <listeners> <add name="xml" /> </listeners> </source> </sources> <sharedListeners> <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="d:\temp\wcf.svclog" /> </sharedListeners> </system.diagnostics>
将具体的错误记录在.svclog文件中,这样设置之后果然在日志文件中提示这个错误:缓冲处理XML内容所需的大小超出了缓冲区配额。然后百度将XmlDictionaryReaderQuotas.MaxStringContentLength属性设置足够大就可以了。但是,有时候这样设置后还是不管用,还需要设置服务端MaxBufferSize属性。这样在流模式(Streamed)传输下使用NetTcpBinding绑定协议出现的【套接字连接已中止】的问题就解决了。
由此,得出一个结论,在刚开始接触WCF遇到问题时应该打开思路而不是局限于错误提示本身,因为在很多情况下,该错误是由于某一个具体的问题导致的,但是给出的提示却是一个比较笼统的文字说明,这个时候就需要透过表现看本质了。由于自己刚开始接触WCF,这过程中遇到很多问题和困难,也走了一些弯路,所以这个问题的解决过程给了一个很好的解决问题的思路!
另外,在项目中还遇到其他问题,这里也一一列举出来,有些问题没有给出解决方案,这里只是记录下来,以后随着对WCF的更加深入再来完善。
1、“XXX”不支持正在使用的.net组祯模式。有关详细信息,请参阅服务器日志。
这个问题一般是在NetTcpBinding绑定下,服务端和客户端配置信息不一致导致的。当时出现的原因是服务端配置文件的终结点中未设置bindingConfiguration属性值,而客户端对Binding进行了自定义设置导致的。这个问题涉及到WCF 4.0的新特性,对于.net 3.5,服务端配置文件中的netTcpBinding/binding节点下的name属性是必须的,否则在服务寄宿的时候会提示“找不到必须的属性name”,而在.net 4.0中该name属性可以不用设置,但是如果不设置则采用默认绑定信息,这样设置后客户端也要按照相同的设置(采用默认绑定信息),否则在服务调用时会出现上面的问题。
2、无法分配XXX字节的托管内存缓冲区。可用内存量可能不足。
这个问题是在使用缓冲模式(Buffered)下上传文件过大时出现的,后来采用流模式(Streamed)传输后就可以了。
3、通道在关闭时接收到意外的输入消息,Action “XXX”只应在不再需要任何消息时关闭通道。
4、此通道已无法再用于发送消息,因为输出会话由于启动的服务器关机而自动关闭。通过DispatchRuntime. AutomiclnputSessionShutdown设置为false来禁用自动关闭,或者考虑使用远程服务器修改关机协议。
以上两个问题是调试服务端提前中断调试后客户端收到的异常信息。