天天看點

解決WCF傳輸的資料量過大問題

WCF大資料傳輸

今天寫了個WCF接口,然後自測通過,和别人聯調時報 遠端伺服器傳回錯誤: (413) Request Entity Too Large        錯誤!記得以前寫的時候也出現過這個錯誤,大緻解決辦法是設定伺服器端的接收最大消息的限制改大點。但具體的配置節點及參數有點忘記了,網上搜了些資料改正并經過自測驗證後通過,主要的配置如下:

  服務端傳回資料量過大的錯誤時,就去修改服務端的配置:

    在bindings節點添加一個binding配置,主要是指定最大的接收資料,主要是maxReceivedMessageSize屬性的值:

<binding name="LargeDataTransferServicesBinding" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:10:00" />      

然後給相應的Service指定bindingConfiguration屬性,指向之前的這個binding配置,注意,因為是服務端的配置,是以是在services節點中加配置,contract這個節點是你的服務契約名:

<services>
      <service name="Huazhu.Certificate.WCFService.SyncDataService">
               <endpoint address="" binding="basicHttpBinding" bindingConfiguration="LargeDataTransferServicesBinding" name="XXX" contract="Huazhu.Certificate.WCFService.ISyncDataService" />
      </service>
    </services>      

配置好後去測試,然後報了另外一個錯誤,大緻如下:

格式化程式嘗試對消息反序列化時引發異常: 對操作“PushMasterData”的請求消息正文進行反序列化時出現錯誤。讀取 XML 資料時,超出最大字元串内容長度配額 (8192)。通過更改在建立 XML 讀取器時所使用的 XmlDictionaryReaderQuotas 對象的 MaxStringContentLength 屬性,可增加此配額。 行 1,位置 2177      

好,現在應該是資料能接收到了,看字面上意思應該是要設定個MaxStringContentLength什麼屬性的值,貌似預設的讀取長度不夠,然後在經過修改binding節點的配置如下:

<binding name="LargeDataTransferServicesBinding" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:10:00" >
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
        </binding>      

經過測試調用成功,但想想如果提供的WCF接口非常多,每個Service都得配置,這樣就太多的重複了。有沒有更簡單的呢?直接上如下代碼說明,隻需要配置一個沒有name屬性的binding節點就可以,連前面的Service都可以不用配置了,我的了解是沒有配置name屬性,就相當于是預設的binding,除非單獨制定了配置,不然都會走這個預設的綁定。

<binding   closeTimeout="00:10:00" receiveTimeout="00:20:00" sendTimeout="00:20:00"
          maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/>      

這個配置同樣适用于WCF的用戶端配置,也是隻需要一個binding即可搞定,本文中的節點的其他一些屬性若有不了解,請自行去網上搜,資料很多。

繼續閱讀