標籤:tle idc out app .config 複雜 data metadata svc
WCF傳輸LIST 大資料量 出現 遠程伺服器返回了意外響應 400 錯誤提示。
出現這個問題,各種搜尋,都沒有解決問題,而且有些都比較複雜,自己琢磨了一下,其實也不是很難,好了,看下面方案。
解決方案:
在web.config(host)端<system.serviceModel>節中, 增加 services 節 如下:
<services>
<service behaviorConfiguration="app.dcgkbehavior" name="ErpAssistWCF.DCGKService" >
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="BindConfig"
contract="ErpAssistWCF.IDCGKService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
service中的name 設定 為 wcf庫名+wcf SVC 檔案名稱。
endpoint中contract 設定為 wcf庫名+wcf CONTRACT 檔案名稱。
注意這裡的幾個關鍵項: behaviorConfiguration,bindingConfiguration,binding
先看第一個關鍵項,看下面的<behaviors>節的配置:
看到<behaviors>中有兩個配置,其中一個name="",這個behavior節是必須有的,不可以刪除。
看第二個behavior節,name為app.dcgkbehavior,這個name可以隨便取,但是,但是,但是,重要的事
情說三遍,這個name 必須要和上面提到的service 節中 behaviorConfiguration後的名字必須一致。
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceTimeouts transactionTimeout="00:50:00"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
<serviceThrottling maxConcurrentCalls="2147483647"
maxConcurrentInstances="2147483647" maxConcurrentSessions="2147483647"/>
</behavior>
<behavior name="app.dcgkbehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceTimeouts transactionTimeout="00:50:00"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
<serviceThrottling maxConcurrentCalls="2147483647"
maxConcurrentInstances="2147483647" maxConcurrentSessions="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
下面說第二個關鍵字 bindingConfiguration ,看下面的<bindings>節:
對了,第二個關鍵字 bindingConfiguration 後對應的名字就是這個接種 binding節的name,即為:
BindConfig
<bindings>
<wsHttpBinding>
<binding name="BindConfig" closeTimeout="00:10:00"
openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="None" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
下面說第三個關鍵字 binding ,看上面的 <bindings>節中,我這裡使用的是 <wsHttpBinding>,所以
,binding關鍵字等於 “wsHttpBinding”。
以上就是在 webconfig中的設定。
設定完畢後,重建WCF。然後在 用戶端,將引用的wcf服務刪掉,重新引用。VS會自動更新
app.config。產生 配置後,其中位元組的允許大小還是預設的,可以參照服務端配置,將數值改為最大
2147483647 。
下面為 app.config產生的配置:
<wsHttpBinding>
<binding name="WSHttpBinding_IDCGKService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00"
sendTimeout="00:10:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
WCF LIST 傳輸大資料,遠程伺服器返回了意外響應 400