一切福田,不離方寸,從心而覓,感無不通。

InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)

WEB站点在调用我们WCF服务的时候,只要传入的参数过长,就报如下错误:

[csharp] view plaincopy

  1. 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: formDataXml。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 第 137 行,位置为 76。”。有关详细信息,请参阅 InnerException。

网上一搜索,答案基本得到解决,可我的问题就是不能解决(主要是细节打败了我),按照网上的文章进行服务器端修改配置如下:

  1. <binding name="HttpBinding" <span style="color:#ff0000"><strong>maxReceivedMessageSize</strong></span>="2097152">
  2.     <readerQuotas maxDepth="32" <span style="color:#ff0000"><strong>maxStringContentLength</strong></span>="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" />
  3.     <security mode="None"></security>
  4.  </binding>

 

其实这里主要的配置是两个:maxReceivedMessageSize、maxStringContentLength

网上提到还需要配置客户端,其实如果是报上面错误就不要管客户端了,因为如果是客户端调用WCF报错,就不是读取XML数据超时,而是明确的错误提示,如下:

[csharp] view plaincopy

  1. 已超过传入消息(1024)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

所以这篇文章提到的错误基本与客户端无关。

一般情况下,安装上面的修改就可以解决问题了,但是我的WCF还是报错,没办法,只能继续找,无意间发现服务器端WCF配置有点异常,不用登录验证的WCF接口有用到bindingConfiguration,但是需要验证的WCF接口就没有配置该属性,如下代码:

  1.    <bindings>
  2.       <wsHttpBinding>
  3.         <span style="color:#ff0000"><binding name="HttpBinding" maxReceivedMessageSize="2097152">
  4.           <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" />
  5.           <security mode="None"></security>
  6.         </binding></span><span style="background-color:#f0f0f0"><binding name="HttpBinding" maxReceivedMessageSize="2097152"> <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" /> <security mode="None"></security> </binding></span>
  7.       </wsHttpBinding>
  8.     </bindings>
  9.     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  10.     <services>
  11.       <service name="Achievo.MMIP.WMP.WebService.WMPProcService" behaviorConfiguration="wmpWcfBehavior">
  12.         <span style="color:#ff0000"><strong><endpoint address="" binding="wsHttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.WMPServiceProcIService"></strong>
  13. </span>          <identity>
  14.             <dns value="localhost" />
  15.           </identity>
  16.         </endpoint>
  17.         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  18.       </service>
  19.       <service name="Achievo.MMIP.WMP.WebService.WMPGetFormDataService" behaviorConfiguration="wmpWcfFormDataBehavior">
  20.         <span style="color:#ff0000"><strong><endpoint address="" binding="wsHttpBinding" bindingConfiguration="HttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.IWMPGetFormDataIService"></strong>
  21. </span>          <identity>
  22.             <dns value="localhost" />
  23.           </identity>
  24.         </endpoint>
  25.         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  26.       </service>
  27.     </services>

注意红色部分的配置,大伙可以对比一下,就发现其中一个缺少bindingConfiguration配置;如果这个时候,把缺少的部分补上,和另外一个配置一样,WCF就会出错,这里我的初步判断是:name="Achievo.MMIP.WMP.WebService.WMPProcService"是必须要验证登录才能访问,所以不能绑定上面的匿名访问的配置,简单说就是规定是验证就不能在配置为匿名;所以把配置修改为如下:

  1. <bindings>
  2.     <wsHttpBinding>
  3.       <span style="color:#ff0000"><strong><binding name="HttpBinding" maxReceivedMessageSize="2097152">
  4.         <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" />
  5.         <security mode="None"></security>
  6.       </binding>
  7.       <binding name="HttpBinding1" maxReceivedMessageSize="2097152">
  8.         <readerQuotas maxDepth="32" maxStringContentLength="2097152"/>
  9.       </binding></strong></span>
  10.     </wsHttpBinding>
  11.   </bindings>
  12.   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  13.   <services>
  14.     <service name="Achievo.MMIP.WMP.WebService.WMPProcService" behaviorConfiguration="wmpWcfBehavior">
  15.       <strong><span style="color:#ff0000"><endpoint address="" binding="wsHttpBinding" <span style="font-size:18px">bindingConfiguration="HttpBinding1"</span> contract="Achievo.MMIP.WMP.WebServiceIService.WMPServiceProcIService"></span></strong>
  16.         <identity>
  17.           <dns value="localhost" />
  18.         </identity>
  19.       </endpoint>
  20.       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  21.     </service>
  22.     <service name="Achievo.MMIP.WMP.WebService.WMPGetFormDataService" behaviorConfiguration="wmpWcfFormDataBehavior">
  23.       <strong><span style="color:#ff0000"><endpoint address="" binding="wsHttpBinding" bindingConfiguration="HttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.IWMPGetFormDataIService"></span></strong>
  24.         <identity>
  25.           <dns value="localhost" />
  26.         </identity>
  27.       </endpoint>
  28.       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  29.     </service>
  30.   </services>

在验证,OK,通过。

转自:http://blog.csdn.net/yang_5/article/details/11775819