无法跨域传递大量数据



我在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跟踪,并查看抛出异常的位置,然后在该端执行必要的配置。

相关内容

  • 没有找到相关文章

最新更新