問題:伺服器未提供有意義的回覆;這可能是由協定不匹配、會話過早關閉或內部伺服器錯誤引起的。 另類的解決辦法,如果實在沒有思路,不妨把代碼還原一下,然後把更改的內容在重新添加一遍,或許問題就解決了。 ...
前言
在做即時通信項目時,手上另一個項目的顛簸,即時通信項目一直是改改停停的,一些改動比較小,沒有即時的簽入,然後一段時間本地的項目代碼與源代碼存在不少區別,在這種情況下,因為新的需求添加,需要給WCF服務添加新的方法,出現了一個浪費我很長時間的問題。
問題
遇到的問題:
伺服器未提供有意義的回覆;這可能是由協定不匹配、會話過早關閉或內部伺服器錯誤引起的。
這個問題,之前有遇到過,並按照網上的解決辦法進行了修改,沒想到又出現了,之前的解決辦法如下:
可能原因:
1、WCF中不允許在協議中定義一個類型而傳輸其子類型. 除非在該類型上定義了[KnownType(typeof(子類型))]
2、WCF傳輸List<object>時序列化問題
WCF傳輸List集合時,在序列化時是有大小限制的,預設的可序列化的集合長度是65536,如果List的大小超出這個值就需要更改了配置了,在伺服器端的behavior配置中增加一行配置:
<behavior name="WCFService.Behavior"> <serviceMetadata/> <serviceDebug includeExceptionDetailInFaults="false" /> <dataContractSerializer maxItemsInObjectGraph="6553600"/> </behavior>
並且在對應的binding配置中添加readerQuotas節點配置:
<binding name="BasicWsHttpBinding"> <reliableSession enabled="true" /> <security mode="None"> <transport clientCredentialType="None" /> <message clientCredentialType="None" /> </security> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> </binding>
解決方法
再次遇到這個問題,心裡一陣恐慌,會話過早關閉與內部伺服器錯誤是不可能的,只能是協定不匹配導致,但是我反覆排查確認,協定也是正確的,花費大量時間後,依然沒有解決此問題,到最後沒辦法,讓同事獲取源代碼的最新版本,然後把我添加的新方法,讓他也添加一遍,清理解決方案後,重新生成,運行後正常啟動。這就無奈了,想前想後,只能把問題歸咎於沒有及時簽入代碼上了,可能版本上會存在一些問題。
經驗教訓
項目中的代碼要及時簽入,改動某些地方後,重新運行程式測試沒問題,就簽入好了。反正有變更集,出問題還可以在還原。另外,遇到一些棘手問題,如果實在沒有思路,不妨把代碼還原一下,然後把更改的內容在重新添加一遍,或許問題就解決了。