【问题标题】:Passing large amounts of data in an WCF service在 WCF 服务中传递大量数据
【发布时间】:2013-04-05 00:30:58
【问题描述】:

我已经看到这个问题出现了几次,但没有真正确定的答案(因为很可能没有)...我有一个 WCF 服务需要从 SQL 中返回大约 14,000 行数据,这些数据按基于列表的数组。

我的服务配置如下:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IParts" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>
</behaviors>

我的客户端配置如下:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IParts" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/RasFuseService/Parts.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IParts"
            contract="MyParts.IParts" name="BasicHttpBinding_IParts" />
    </client>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
</system.serviceModel>

有些地方不对,因为我收到了错误:

格式化程序在尝试反序列化消息时抛出异常: 尝试反序列化参数http://tempuri.org/:GetSurplusECMResult 时出错。 InnerException 消息是“对象图中可以序列化或反序列化的最大项目数为“65536”。 更改对象图或增加 MaxItemsInObjectGraph 配额。 '。有关详细信息,请参阅 InnerException。

即使我明确地为 MaxItemsInObjectGraph 分配了一个最大整数...

我已经阅读了有关流式传输和分页的信息,但是单次返回的数据真的太多了吗?

【问题讨论】:

  • 从用户的角度考虑一下,我真的要一次处理超过 200 行数据吗?答案很可能是否定的。
  • 返回的数据是设计要求的...这家公司想知道在 (x) 和 (x) 日期之间销售了什么...
  • 请注意,您还必须在客户端上执行此操作。请参阅此处(向下滚动以获取答案):social.msdn.microsoft.com/Forums/en-US/wcf/thread/…
  • @MaxOvrdrv,我把它贴在上面...
  • 是否必须在一条消息中传输?

标签: c# .net wcf web-services


【解决方案1】:

想通了(打了额头) 我最终在客户端写了一个不正确的条目。客户端的正确语法应该是:

  <behaviors>
    <endpointBehaviors>
      <behavior >
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </endpointBehaviors>
  </behaviors>

没有

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

它现在返回并反序列化我的大数组而不会抱怨......

【讨论】:

    【解决方案2】:

    我的 WCF 服务返回原始表格数据,一次只有几兆字节。

    XML 序列化很糟糕...大量元素和浪费空间,而且速度也很慢。在这种情况下,我处理了自己的响应生成,并返回了格式为 CSV 数据的数据。由客户端生成、发送和解析都快得多。

    我使用的是 RESTful WCF(这是在 ASP.NET 将 WCF 替换为 REST 之前),所以我只是从我的 WCF 方法返回了一个 Stream。

    【讨论】:

      【解决方案3】:

      在您的客户端配置中,您的行为有一个名称,但您似乎没有使用该名称。在某处使用名称或省略名称以使您的行为成为服务配置中的默认行为。

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 2012-11-22
        • 2012-09-19
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 2010-11-05
        相关资源
        最近更新 更多