首页 > 代码库 > WCF LIST 传输大数据,远程服务器返回了意外响应 400
WCF LIST 传输大数据,远程服务器返回了意外响应 400
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