標籤:style blog http io color ar os 使用 sp
最近剛接觸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來禁用自動關閉,或者考慮使用遠程伺服器修改關機協議。
以上兩個問題是調試服務端提前中斷調試後用戶端收到的異常資訊。
WCF流模式傳輸下採用NetTcpBinding