最大名称表字符计数配额(16384)已超过限制。

5
我刚刚增加了ServiceContract中的方法数量。当我在Visual Studio中更新Service Reference时,我收到以下消息:

元数据包含一个无法解析的引用: “net.tcp://xxxxx.com:8002/DataQueryService/mex”。

XML文档中存在错误。

读取XML数据时已超过最大的nametable字符计数配额(16384)。nametable是一种用于存储在XML处理期间遇到的字符串的数据结构,具有非重复元素名称、属性名称和属性值的长XML文档可能会触发该配额。通过在创建XML阅读器时使用XmlDictionaryReaderQuotas对象更改MaxNameTableCharCount属性可以增加此配额。

原始服务器端配置如下:
 <services>
      <service behaviorConfiguration="XXXXX.DataQueryService.ServiceBehavior" name="XXXXX.DataQueryService.QueryService">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://xxxxx.com:8002/DataQueryService" />
          </baseAddresses>
        </host>
        <endpoint name="MexEndpoint" address="mex" binding="customBinding" bindingConfiguration="unsecureTcpMex" contract="IMetadataExchange" />
    </service>
</services>

<bindings>
    <customBinding>
        <binding name="unsecureTcpMex">
            <tcpTransport portSharingEnabled="True" />
        </binding>
    </customBinding>    
</bindings>

我把它修改成了:
<bindings>
    <customBinding>
        <binding name="unsecureTcpMex">
            <textMessageEncoding>
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
            </textMessageEncoding>
            <tcpTransport portSharingEnabled="True" maxReceivedMessageSize="2147483647"  />
        </binding>
    </customBinding>    
</bindings>

我需要对配置文件进行哪些更改才能让它正常工作?

更新根据@Chris的建议,我尝试更新了SVCUtil的配置文件。我为我的终结点添加了一个名称,以便它匹配(已上面更新)。现在,SvcUtil.config如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="unsecureTcpMex">
                    <textMessageEncoding>
                        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    </textMessageEncoding>
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint binding="customBinding" bindingConfiguration="unsecureTcpMex"
                contract="IMetadataExchange"
                name="MexEndpoint" />
        </client>
    </system.serviceModel>
</configuration>

也许你的消息太大或者由太多的XML元素/属性组成了? - Simon Mourier
操作合约的数量增加了。这是导致问题的原因。 - openshac
你正在使用哪个版本的WCF(双方)? - ranieuwe
4个回答

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

看看这一行:maxNameTableCharCount="1638400"

谢谢Bart,但我已经将该值从默认值16384增加到整数的最大值-2147483647。 - openshac

1
我不认为将操作拆分成多个合同是实际的。请问我们需要处理多少个服务操作?
您尝试过此帖子中的解决方案吗? http://social.msdn.microsoft.com/Forums/vstudio/en-US/17592561-c470-452a-a52c-2a5a2839582c/metadataexchangeclient-and-nametable-character-count-quota 除其他建议外,使用Discovery协议读取元数据是没有任何阅读器配额的: http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx 底部的解决方案建议您在启动服务之前在代码中更改默认的阅读器配额。我相信这必须在自定义ServiceHost工厂中完成。如果需要帮助,请告诉我。
希望这有所帮助。

谢谢,我已经看了你给的第一个链接。我们的解决方案可能已经太成熟了,无法像建议的那样更改发现方法。我已经看到其他人成功地更改了readerQuotas,所以我也想这样做。这意味着只需要更改配置文件中的几行代码。当你说“在自定义ServiceHost工厂中”时,你是什么意思?难道不能在配置文件中完成吗? - openshac
本页面介绍如何创建自定义服务主机以进行一些自定义配置,除了读取配置文件外,还包括如何与IIS一起使用。http://msdn.microsoft.com/en-us/library/aa395224.aspx 这将允许您在创建服务之前设置阅读器配额,我相信这是您问题的根源,也是为什么仅通过配置文件无法完成的原因。祝你好运! - The other other Alan
我想问一下,SvcUtil.exe和Visual Studios服务引用在这个解决方案中仍然无法使用,我的构建过程是自动化的,实际上构建也失败了,所以我需要找到一个解决方案,可以只修改配置文件。其他许多人已经通过修改客户端配置文件成功地解决了这个问题,我只是想找出我的配置文件中有哪些错误。 - openshac
我想指出,在第一个链接的页面底部有一些代码可以为我解决这个问题。我正在使用IIS6,并且必须使用反射来增加System.ServiceModel中ReaderQuotas中的MaxNameTableCharCount。我无法在配置文件中进行修复,谢谢。 - willDaBeast

0

尝试以程序方式设置MaxNameTableCharCount属性的新值:

Binding binding = endpoint.Binding;

XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas();
myReaderQuotas.MaxStringContentLength = something;
myReaderQuotas.MaxArrayLength = something;
myReaderQuotas.MaxBytesPerRead = something;
myReaderQuotas.MaxDepth = something;
myReaderQuotas.MaxNameTableCharCount = something;

binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null);

注意:在客户端代理和/或服务器主机创建之前必须设置它。一旦创建,就不能更改。


我们的构建过程是自动化的,实际上构建也失败了,所以我需要找到一个解决方案,可以只修改配置文件。其他许多人已经通过修改客户端配置文件成功地克服了这个问题。我只是想找出我的配置文件中有什么错误。 - openshac
你的错误信息还是说:“最大名称表字符计数配额(16384)”?我建议尝试这个,因为它似乎没有读取您的新值(16384而不是2147483647)。我曾经遇到过类似的问题,但从配置文件中更改无效,但在运行时却有效。 - Maurizio In denmark
是的,错误信息仍然是一样的。我们的构建脚本设置了需要在配置文件中指定该值。更改配置对其他用户有效。有没有任何原因导致它对我无效? - openshac

0

谢谢。我已经为SvcUtil.exe添加了一个配置文件,如上所述。然而,我仍然遇到相同的错误。是只需要更改SvcUtil文件还是还需要更改服务器端的文件? - openshac
你只应该更改消费应用程序。 - ranieuwe
好的,我尝试修改了SvcUtil的配置文件(如上所述),但仍然无法正常工作。 - openshac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接