我在使用WCF服务
返回字节数组时遇到以下错误“读取XML数据时已超出最大数组长度配额(16384)。 通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象上的MaxArrayLength属性,可以增加此配额。第1行,第23626位。“
我甚至试图增加
<wsHttpBinding>
<binding name="EnrollmentSoapBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
<readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" />
</binding>
</wsHttpBinding>
另外,
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
仍然没有运气。还有其他想法吗?
答案 0 :(得分:5)
您的客户端和服务都必须在其配置中设置maxArrayLength
属性。
你显然没有在其中一个中设置它。对于maxArrayLength
,默认值为16384。
答案 1 :(得分:2)
除了Derek的答案之外,还有一些其他可能性maxArrayLength
的新值未被提取。
一个是绑定配置尚未分配给端点。例如,如果端点如下所示:
<endpoint address="" binding="wsHttpBinding" contract="MyService.IMyService1" />
然后将使用wsHttpBinding
的默认值,无论配置文件中的其他位置指定什么。要分配已定义的绑定配置,请使用bindingConfiguration
属性:
<endpoint address="" binding="wsHttpBinding"
bindingCongifuration="EnrollmentSoapBinding"
contract="MyService.IMyService1" />
另一种可能性是,如果没有定义端点(至少在服务中)。在这种情况下,框架(在.NET 4.0及更高版本中)将提供默认端点。默认端点默认使用basicHttpBinding
并具有默认值。
在这种情况下可以做一些事情。可以显式声明端点并为其分配绑定(如我的答案的第一部分所示)。
可以通过省略name
属性声明绑定并将其设置为默认值,如下所示:
<wsHttpBinding>
<binding maxReceivedMessageSize="2147483647"
maxBufferPoolSize="2147483647">
<readerQuotas maxArrayLength="2147483647"
maxStringContentLength="2147483647"
maxBytesPerRead="2147483647" />
</binding>
</wsHttpBinding>
在这种情况下,如果没有定义端点,您还需要更改http的协议映射:
<protocolMapping>
<add binding="wsHttpBinding" scheme="http"/>
</protocolMapping>
然后将wsHttpBinding
设置为http
的默认绑定,并使用上面定义的“自定义”默认绑定设置。
如果没有看到服务和客户端配置,很难说真正的问题是什么。