3

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

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

4

2 回答 2

5

您的客户端和服务都必须maxArrayLength在其配置中设置属性。

您显然没有将其设置在其中之一中。默认为 16384 为maxArrayLength.

于 2013-09-02T17:45:17.333 回答
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,并且将使用上面定义的“自定义”默认绑定设置。

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

于 2013-09-02T18:32:30.067 回答