我有一个我实现的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>
答案 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打开该跟踪文件。您可以很好地查看所有错误以及处理邮件时的实际错误。