WCF服务 - 数组大小限制

时间:2012-03-06 13:28:11

标签: wcf .net-3.5 basichttpbinding bad-request

我有一个我实现的WCF服务方法,它传递了一个IEnumerable

    [OperationContract]
    List<Item> GetItems(DateTime sinceDate, IEnumerable<Guid> idList);

当传入大小为1000或更小的IEnumerable时,该方法按预期工作;服务返回预期的响应。在某些时候,传入的数组太大(在2000个项目中看到)并抛出System.ServiceModel.ProtocolException"{"The remote server returned an unexpected response: (400) Bad Request."}"

我不确定控制数组大小限制的是什么。我知道绑定的readerQuotas部分,maxArrayLength设置为默认值16384.我的缓冲区大小设置得足够大,但我不确定为什么服务调用失败。传入的数组大小的basicHttpBinding是否有限制?我的配置需要更改什么才能传入大型数组?

这是我在客户端的app.config。服务器端是等效的。

<binding name="BasicHttpBinding_IMyService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="20000000" maxBufferPoolSize="524288" maxReceivedMessageSize="20000000"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                  realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
</binding>

1 个答案:

答案 0 :(得分:0)

您需要注册增加图表中最大对象项的服务行为:

<serviceBehaviors>
    <behavior name="IncreadedSizeBehavior">
      <dataContractSerializer maxItemsInObjectGraph="100000"/>
    </behavior>
  </serviceBehaviors>

然后,您需要在端点中注册此行为:

<services>
    <service name="MyService" behaviorConfiguration="IncreadedSizeBehavior">
        <host />
        <endpoint />
</services>

调试wcf问题时最有用的是跟踪错误记录:

<system.diagnostics>
        <trace autoflush="true" />
        <sources>
            <source name="System.ServiceModel"
                            switchValue="Error"
                            propagateActivity="true">
                <listeners>
                    <add name="sdt"
                            type="System.Diagnostics.XmlWriterTraceListener"
                            initializeData= "ErrorTrace.svclog"
                            />
                </listeners>
            </source>
        </sources>
    </system.diagnostics>

然后使用svc跟踪查看器downloadable with the windows sdk打开该跟踪文件。您可以很好地查看所有错误以及处理邮件时的实际错误。