2

好的,我正在尝试解决“他的最大字符串内容长度配额(8192)”问题,我在这篇文章中看到了答案:

读取 XML 数据时已超出最大字符串内容长度配额 (8192)

我不想在我的生产服务器上乱搞配置(严重的胖手指情况)所以我将代码和配置复制到我的本地机器上用原始配置进行测试运行......不要'没有得到问题,所以无法测试我的新配置将解决问题.... grrr。

默认 readerQuotas 值在哪里设置?

我检查了 machine.config 和 web.config 中的 %\Microsoft.NET\Framework64\v4.0.30319\Config。看不到任何看起来正确的东西。有什么帮助吗?

重申一下,我正在尝试在本地复制此问题。任何破坏我的机器的帮助将不胜感激。

4

4 回答 4

2

谢谢你们的帮助。但是,您给了我解决问题的方法,而不是如何复制它,我的问题是我没有在本地遇到问题并想找出原因,所以我可以摆弄我的配置并确定我的所有测试etc 在将配置更改部署到我的实时服务器之前运行。但最终解决方案与您的建议略有不同。我正在使用简化的 wcf 配置:

<behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

我喜欢它,因为我有很多服务正在运行这个项目,并且不想将它们单独连接起来。

当我开始检查我的本地机器(相同编译的 dll/config 在其上工作)和 prod 机器(它们不工作的地方)之间的区别时,区别是......

...我在本地安装了 .net 4.5,但没有在我的产品服务器上。安装似乎更新了使用的默认值,我的服务现在可以工作(使用原始配置)

再次感谢您的帮助。

于 2013-09-13T09:57:29.433 回答
0

简短的回答是,只需以这种方式将您的读者配额保持在您关注的绑定下(同时在绑定节点下增加 maxReceivedMessageSize),您可以放心,此错误不会出现在 production 上。它应该处理现实世界中任何大小的消息,但是您应该限制每个 wcf 设计所需的每个大小限制的数量。

      <binding name="BindingForBiggerMessages"
      maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647"
         maxStringContentLength="2147483647"
         maxArrayLength="2147483647"
         maxBytesPerRead="2147483647"
         maxNameTableCharCount="2147483647" />
    </binding>

还要确保您在 wcf 端的配置中所做的更改也在客户端应用程序端的配置中完成,否则将无法正常工作。

详细:---------------

这只是为了介绍如何在本地复制此问题,这实际上是不需要的,因为它在 wcf 社区中是众所周知的错误并且有针对它的有效解决方案,上面已经分享了

我觉得“Secret Squirrel”链接应该有助于解决这个问题,如果你还没有让它工作,那么请阅读这个,它会清楚地知道这些键在读者配额下是什么:

http://lucvknet.blogspot.com/2010/09/when-wcf-blows-whistle-part1.html

我想您需要关注的关键是MaxStringContentLength。实际上,您的生产应用程序的客户端正在向 wcf 发送消息,该消息在其中一个字段/属性中包含超过 8192 个字符(假设根据您的生产问题描述)。

在您的 wcf 配置(您在本地运行的生产副本)中查看,如果MaxStringContentLength在您的绑定下定义/配置(对于大型消息/对象来说是中断的绑定),如果未定义,则使用小于字符数的值定义它,您想测试消息中的给定字段(中断)。

因此,如果您希望您的 wcf 中断一个包含超过 8192 个字符的元素/字段的消息,则使其小于 8192,然后使用具有超过 8192 的字符串字段/成员的对象( wcf 方法的参数)调用 wcf字符,那么它应该打破。

注意:如果您在配置中看到MaxStringContentLength已定义为 8192,但您仍然没有遇到大消息/数据的问题,那么请确保消息具有一个设置了值的字段,使其超过了 MaxStringContentLength 设置的字符限制)

如果中断并且您收到与生产应用程序相同的错误,则只需将其配置为更高的值。

注意:如果您没有在 wcf 绑定中看到这些键定义,那么 wcf 将使用这些配额的默认值,因为它们不是您定义的,因此要复制问题首先要自己定义一个以覆盖任何默认设置。

于 2013-09-12T11:20:50.853 回答
0

试试这个

<system.serviceModel>
<bindings>
  <basicHttpBinding>
     <binding name="BindingName" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"/>
     </binding>
 </basicHttpBinding>
</bindings>
</system.serviceModel> 
于 2013-09-12T12:33:24.870 回答
0

您必须在服务器和客户端上设置配额。如果您错过其中一个,您仍然会收到此错误。

<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
于 2013-09-12T12:36:16.110 回答