最近剛接觸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來禁用自動關閉,或者考慮使用遠程服務器修改關機協議。
以上兩個問題是調試服務端提前中斷調試后客戶端收到的異常信息。
