我在c# mvc应用程序中使用wcf服务。我需要通过wcf向客户端(控制器)获取大量数据(大约20000条记录)。
在本地版本-我得到所有的记录很好,但在服务器版本,我没有得到任何东西,如果我不限制查询1000条记录。
当它不受限制并试图带来所有记录时,这是我在客户端日志中得到的:
System.ServiceModel。通信异常:当发生错误时接收到xxx/WCF.svc的HTTP响应。这可能是由于到不使用HTTP协议的服务端点绑定。这也可能是由于HTTP请求上下文被服务器(可能是由于服务关闭)。查看服务器日志了解更多详情。--> system.net.webeexception:底层连接已关闭:在接收时发生意外错误。--->System.IO.IOException:无法从传输读取数据connection:已存在的连接被远程强制关闭主人--> System.Net.Sockets.SocketException:一个存在的连接被远程主机在System.Net.Sockets.NetworkStream。读取(Byte[] buffer, Int32偏移量)Int32的大小)——内部异常堆栈跟踪结束——atSystem.Net.Sockets.NetworkStream。读取(Byte[] buffer, Int32偏移量)在System.Net.PooledStream。Read(Byte[] buffer, Int32offset, Int32大小)System.Net.Connection。SyncRead(HttpWebRequest请求,Boolean)userRetrievedStream, Boolean (probeRead)——内部异常结束栈跟踪——在System.Net.HttpWebRequest.GetResponse(System.ServiceModel.Channels.HttpChannelFactory 1. httprequestchannel.httpchannelrequest.waitforreply(时间间隔——内部异常堆栈跟踪结束——
我已经把这个添加到web。在客户端配置,但没有帮助:
<behaviors>
<endpointBehaviors>
<behavior >
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
任何想法?
您的绑定配置设置为允许大数据吗?如果你使用httpbinding,你应该这样配置你的端点和你的服务
<basicHttpBinding>
<binding name="LargeDataBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="998192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
其他试图在您的服务器上增加IIS支持的请求中内容的最大长度
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295" />
</requestFiltering>
</security>
正如Mackho所说,您应该在第一个配置设置中增加超时。此外,客户端必须增加它们的超时值和它们可以从服务器获得的最大内容。
另外,如果你真的需要传递所有的数据而不想使用分页,你可以使用流。要配置你的服务以流模式运行,添加:
<bindings>
<basicHttpBinding>
<binding transferMode="Streamed" name="LargeDataBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="998192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
请注意,您的客户端设置也很重要:
- 最低超时将优先(从客户端或服务器)
- maxStringContentLength和客户端关于他们可以接收多少的设置之间的最小值将优先
- 要使用流,客户端必须支持它并具有相同的设置(否则,在客户端上数据将被缓冲)
这实际上取决于异常是由服务器还是由客户端抛出的。在两者中启用WCF跟踪,并查看抛出异常的位置,然后在该端执行必要的配置。