2

我有一个我已经实现的 WCF 服务方法,它通过了 IEnumerable

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

当传入大小为 1000 或更少的 IEnumerable 时,该方法按预期工作;服务返回预期的响应。在某些时候,传入的数组太大(见于 2000 个项目)并System.ServiceModel.ProtocolException抛出 a,"{"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>
4

1 回答 1

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 跟踪查看器打开该跟踪文件,可通过 windows sdk 下载。您可以很好地了解所有错误以及处理消息时的实际错误。

于 2012-03-06T13:42:15.450 回答