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

时间:2012-08-07 15:48:27

标签: c# web-services wcf

我有一个C#4.0控制台应用程序,它调用位于ASP.net 4.0网站内的WCF Web服务。调用Web服务时,出现此错误:

The formatter threw an exception while trying to deserialize the message: 
Error in deserializing body of request message for operation 'AddArticle'. 
The maximum string content length quota (8192) has been exceeded while 
reading XML data. This quota may be increased by changing the 
MaxStringContentLength property on the XmlDictionaryReaderQuotas object 
used when creating the XML reader. 
Line 60, position 267.

所以环顾四周似乎需要将配置文件中的maxStringContentLength和maxReceivedMessageSize属性增加到一个很大的数量。我已经这样做但仍然收到错误。

我的控制台应用程序的配置是:

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IXXXInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://axa-ppp/webservices/xxxinterface.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IXXXInterface" contract="XXX_YYYY_Interface.IXXXInterface" name="BasicHttpBinding_IXXXInterface"/>
    </client>

网站的配置是:

      <binding name="BasicHttpBinding_IXXXInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="None">
              <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
              <message clientCredentialType="UserName" algorithmSuite="Default"/>
          </security>
      </binding>

    <endpoint address="http://xxx-ppp/webservices/xxxinterface.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IXXXInterface" contract="XXX_YYYY_Interface.IXXXInterface" name="BasicHttpBinding_IXXXInterface"/>

修改

这是网站上的类文件:

public class XXXInterface : IXXXInterface
{

public bool AddArticle(string Title, string ArticleXml)
{
    ContentData article = new ContentData();
    article.Title = Title;
    article.Html = ArticleXml;
    article.FolderId = 320;

    ContentData newArticle = contentMgr.Add(article);

    if (newArticle == null)
    {
        return false;
    }
    else
    {
        return true;
    }        
}
}

1 个答案:

答案 0 :(得分:0)

我发现了问题! :d

问题出在IdBookIssuerIssuedTokenBinding.CreateBindingElements()

我已经被覆盖而没有打电话给基地:

public override BindingElementCollection CreateBindingElements()
{
    BindingElementCollection elements = new BindingElementCollection();

    elements.Add(this.security);
    elements.Add(this.transport);

    return elements;
}

现在我这样做:

public override BindingElementCollection CreateBindingElements()
{
    BindingElementCollection elements = base.CreateBindingElements();

    var securityBindingElement = elements.Find<SecurityBindingElement>();
    elements.Remove(securityBindingElement);
    elements.Add(this.security);

    var transportBindingElement = elements.Find<HttpTransportBindingElement>();
    elements.Remove(transportBindingElement);
    elements.Add(this.transport);

    return elements;
}

它就像一个魅力!

我无法解释为什么我需要打电话给基地。如果有人可以在评论中解释,那就太棒了!

https://stackoverflow.com/a/19574170/4339857