WCF字节数组 - 最大数组长度配额错误

时间:2013-09-02 17:42:27

标签: wcf

我在使用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"/>

仍然没有运气。还有其他想法吗?

2 个答案:

答案 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的默认绑定,并使用上面定义的“自定义”默认绑定设置。

如果没有看到服务和客户端配置,很难说真正的问题是什么。