通过 WCF 传输大量数据

Posted

技术标签:

【中文标题】通过 WCF 传输大量数据【英文标题】:Large Amount of Data Transferring via WCF 【发布时间】:2012-04-29 07:08:36 【问题描述】:

我在我的项目中使用 WCF 从服务器(访问数据库)和客户端传输数据,客户端在屏幕上绘制数据。

传输的数据量比较大,所以我想知道哪种方法最好。

现在,我可以查询少量数据,大约 3600 个对象(时间戳和双精度值)。但是,当这个数字增加到大约 86400 个对象时,服务函数调用就会发生错误。

我的服务和客户端声明如下:

服务器:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata/>
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="serviceName">
        <endpoint binding="netTcpBinding" contract="interfaceName">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:5050/msservice"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

客户:

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IService" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxConnections="10"  maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
          <security mode="Transport">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
            <message clientCredentialType="Windows"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:5050/msservice" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService" contract="IService" name="NetTcpBinding_IService">
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

【问题讨论】:

你看过流媒体吗? Large Data and Streaming 【参考方案1】:

您在使用 .net 4 吗?如果不是,我相信您需要为服务行为提供一个名称并将其与服务相关联。

编辑:否则,可以使用默认的 maxItemsInObjectGraph 值 65536。

<system.serviceModel>
<services>
    <service name="YOURPROJECT.Web.YOURSERVICE"
            behaviorConfiguration="YOURPROJECT-Web-YOURSERVICE">
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="YOURPROJECT-Web-YOURSERVICE">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
            <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

【讨论】:

请记下 maxItemsInObjectGraph 属性,因为这是 OP 正在寻找的。​​span> 我做了,它的设置高于应该导致错误的值。 6553600 > 86400。默认是65536。似乎较大的值是无法识别的。可能是因为行为。 我正在使用 .Net 4。我应该将 maxItemsInObjectGraph 添加到 6553600 还是 2147483647? 为了这个测试,我会选择 2147483647。此外,将行为显式关联到服务可能没有什么坏处。您不必这样做,但可以帮助排除故障。

以上是关于通过 WCF 传输大量数据的主要内容,如果未能解决你的问题,请参考以下文章

WCF传输1-你是否使用过压缩或Json序列化?

流式处理 WCF 大量对象

WCF传输1-你是否使用过压缩或Json序列化?

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

如何通过 WCF 流传输 MemoryStream

无法跨域传递大量数据