已超出最大名称表字符计数配额(16384)

时间:2013-08-14 15:46:37

标签: wcf configuration wcf-binding

我刚刚增加了ServiceContract中的方法数量。当我在Visual Studio中更新服务引用时,我收到消息:

  

元数据包含无法解析的引用:   '的net.tcp://xxxxx.com:8002 / DataQueryService / MEX'

     

XML文档中存在错误。

     

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

原始服务器端配置为:

 <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>

4 个答案:

答案 0 :(得分: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”

答案 1 :(得分: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工厂中完成。如果您愿意,请告诉我。

希望这有帮助。

答案 2 :(得分:0)

这应该有所帮助: http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx 似乎解决方案是为svcutil创建一个配置文件并将其放在与它相同的文件夹中。

答案 3 :(得分: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);

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