无法跨域传递大量数据

时间:2014-05-12 11:34:03

标签: c# .net wcf asp.net-mvc-4 cross-domain

我在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>

有什么想法吗?

2 个答案:

答案 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>

请注意,您的客户端设置也很重要:

  • 最低超时时间(来自客户端或服务器)
  • maxStringContentLength与客户端设置之间的最低值,以及他们可以获得的收费将占上风
  • 要使用流式传输,客户端必须支持它并且也具有相同的设置(否则,在客户端上数据将被缓冲)

这实际上取决于服务器或客户端是否抛出异常。在它们中启用WCF跟踪并查看抛出异常的位置,然后在该侧执行必要的配置。