我在c#mvc应用程序中使用wcf服务。我需要通过wcf到客户端(到控制器)获取大量数据(大约20000条记录)。
在本地版本中 - 我很好地获取了所有记录,但是在服务器版本中,如果我不将查询限制为1000条记录,我什么都得不到。
当它没有限制并试图带来所有记录时,这就是我在客户端日志中得到的结果:
System.ServiceModel.CommunicationException:发生错误 接收到xxx / WCF.svc的HTTP响应。这可能是应该的 不使用HTTP协议的服务端点绑定。这个 也可能是由于HTTP请求上下文被中止 服务器(可能是由于服务关闭)。查看服务器日志 更多细节。 ---> System.Net.WebException:底层 连接已关闭:接收时发生意外错误。 ---> System.IO.IOException:无法从传输中读取数据 连接:远程强制关闭现有连接 主办。 ---> System.Net.Sockets.SocketException:现有连接 被远程主机强行关闭了 System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量, Int32 size)---内部异常堆栈跟踪结束--- at System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量, 在System.Net.PooledStream.Read(Byte []缓冲区,Int32中的Int32大小) offset,Int32 size)at System.Net.Connection.SyncRead(HttpWebRequest请求,布尔值 userRetrievedStream,Boolean probeRead)---内部异常结束 堆栈跟踪---在System.Net.HttpWebRequest.GetResponse()处 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)---内部异常堆栈跟踪结束---
我已将此添加到客户端的web.config中,但它没有帮助:
<behaviors>
<endpointBehaviors>
<behavior >
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
有什么想法吗?
答案 0 :(得分:1)
您的绑定配置是否设置为允许大数据? 如果您使用的是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>
答案 1 :(得分:1)
正如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>
请注意,您的客户端设置也很重要:
这实际上取决于服务器或客户端是否抛出异常。在它们中启用WCF跟踪并查看抛出异常的位置,然后在该侧执行必要的配置。