没有在本地获得“最大字符串内容长度配额(8192)”

时间:2013-09-12 10:24:33

标签: .net wcf quota

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

The maximum string content length quota (8192) has been exceeded while reading XML data

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

默认readerQuotas值在哪里设置?

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

重申一下,我试图在本地复制这个问题。任何打破我的机器的帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

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

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

我喜欢,因为我有很多服务用完了这个项目,并且不想单独连接它们。

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

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

再次感谢您的帮助。

答案 1 :(得分:0)

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

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

确保在wcf end的配置中进行的更改也在客户端应用程序端的配置完成,否则将无效。

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

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

我觉得“秘密松鼠”链接应该有助于解决此问题,如果你还没有工作,那么请阅读本文,它会清楚地了解这些键在读者配额下的含义:

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

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

如果在绑定下定义/配置了 MaxStringContentLength ,请参阅wcf配置(本地运行的生产副本) (对大型消息/对象进行破坏的绑定),如果未定义,则使用小于字符数的值来定义它,您希望针对消息中的给定字段进行测试(中断)。

因此,如果你想让你的wcf中断一个元素/字段超过8192个字符的消息,那么保持它小于8192,然后用object调用wcf(参数到wcf方法)如果字符串字段/成员中包含超过8192个字符,那么它应该会中断。

注意:如果您在配置中看到 MaxStringContentLength 已定义为8192,那么您仍然无法获得大型邮件/数据的问题,请确保邮件是设置一个值的字段,使其超过MaxStringContentLength设置的字符数限制

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

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

答案 2 :(得分:0)

试试这个

<system.serviceModel>
<bindings>
  <basicHttpBinding>
     <binding name="BindingName" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"/>
     </binding>
 </basicHttpBinding>
</bindings>
</system.serviceModel> 

答案 3 :(得分:0)

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

<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />