今天遇到兩個問題,一個主要問題,一個次要問題。
主要問題:上傳下載大點的資料檔案,WCF用預設配置不能正常的序列化和還原序列化。
運行WCF,上傳13K的XML資料出錯。錯誤如下:
格式化程式嘗試對訊息還原序列化時引發異常,對操作"SetFigureData"的請求訊息本文進行還原序列化時出現錯誤。讀取XML資料時,超出最大字串內容長度配額(8192)。通過更改在建立XML讀取器時所使用的XmlDictionaryReaderQuotas對象的MaxStringContentLenght屬性,可增加此配額。第156行,位置為48。
解決辦法,有位園友寫到了,可以參考如下:
http://www.cnblogs.com/upzone/archive/2009/01/20/1378655.html
大致思路:上傳不行,就看伺服器端的App.config;下載不行,就看用戶端的App.config。我沒從這出發,我在做上傳的時候,老拘泥於用戶端的App.config檔案,其實早配對了,還是報錯,出錯原因是在伺服器端的App.config中,沒配置,就是用預設的設定了。當然,網上還有個人,說去改machine.config檔案,更是小題大作,把問題想遠了。我們都知道machine.config是根,不應該隨便動的,應該專事專辦。
我再補充下,WCF產生的檔案App.config檔案,是不包含bindings節點的。(就為這個,浪費我40分鐘時間,我把下面兩部分沒當成在一個檔案裡,但是切記它們實際是在一個檔案裡。)
<bindings>
<wsHttpBinding>
<binding name="NewBinding2" maxReceivedMessageSize="67108864">
<readerQuotas maxStringContentLength="67108864"/>
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
<service behaviorConfiguration="DomainWS.DomainServiceV2Behavior"
name="DomainWS.DomainServiceV2">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding2" contract="DomainWS.IDomainV2">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
次要問題:
在解決上述問題的時候,引入的另一個問題,嘗試按MSDN部落格上一個人的方法,修改用戶端的App.config,結果用戶端的Binding方式變了,從wsHttpBinding改為basicHttpBinding,卻忘了改伺服器的Binding方式,還是用的wsHttpBinding。當然對不上號了,一運行如下錯誤出現:
服務 http: 不支援內容類型 text/xml; charset=utf-8。用戶端和服務綁定可能不匹配。
按關鍵字一搜,就找到類似問題了。不過那個樓主在看到真正的答案的時候,好像也沒意識到。哎,可惜了。
總結來說,分析問題的能力很重要,老外管它叫“Trouble Shooting Ability”。