如何在创建XML阅读器时增加MaxStringContentLength大小

时间:2013-09-17 12:02:07

标签: .net wcf web-services wcf-data-services wcf-binding

我收到以下错误:

  

格式化程序在尝试反序列化消息时抛出异常:反序列化操作“InsertQuery”的请求消息体时出错。读取XML数据时已超出最大字符串内容长度配额(8192)。通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额。第1行,第33788位。

为了增加MaxStringContentLength的大小,我修改了我的Web.config,如下所示。

<?xml version="1.0"?>
<configuration>

<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingDev">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"  maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

即便如此,我也遇到同样的错误:(

请告诉我为解决此问题需要做出哪些更改。 在此先感谢!!

1 个答案:

答案 0 :(得分:4)

您是Web.config文件表明您使用的是.NET 4.0,并且Web.config中没有明确定义的端点,因此WCF会为您提供一个默认端点(基于*的位置)。 svc文件),并使用basicHttpBinding方案的默认绑定httpmaxStringContentLength的默认值为8192。

要更改它,您需要:

      
  1. 显式添加端点并将您定义的绑定(使用绑定配置的`name`属性)分配给端点的`bindingConfiguration`属性,或
  2.   
  3. 通过删除`name`属性,将您在配置文件中定义的绑定配置作为该类型绑定的默认配置,并将`http`的默认映射从`basicHttpBinding`更改为`webHttpBinding`。
  4. 要通过显式端点执行此操作,请将以下内容添加到<system.serviceModel>下的Web.config文件中:

    <services>
      <service name="your service name">
        <endpoint address="" binding="webHttpBinding" 
                  bindingConfiguration="webHttpBindingDev" 
                  contract="your fully-qualified contract name" />
      </service>
    </services>
    

    您必须为您的服务名称和合同提供正确的值。

    要通过设置默认值来执行此操作,您需要删除webHttpBinding属性,将name的指定绑定配置标记为默认值:

    <bindings>
      <webHttpBinding>
        <binding>
          <readerQuotas maxDepth="2147483647" 
                        maxStringContentLength="2147483647"  
                        maxArrayLength="2147483647" 
                        maxBytesPerRead="2147483647" 
                        maxNameTableCharCount="2147483647" />
        </binding>
      </webHttpBinding>
    </bindings>
    

    接下来,您需要将webHttpBinding设置为http方案的默认绑定:

    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
    </protocolMapping>
    

    通过这两项更改,您无需添加显式端点。

    此外,由于您使用的是webHttpBinding,我相信您需要将以下内容添加到端点行为中:

    <behaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    

    有关WCF 4中默认端点,绑定等的更多信息,请查看A Developer's Introduction to Windows Communication Foundation 4