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

Wcf 已超过最大名称表字符计数配额(16384),wcf,configuration,wcf-binding,Wcf,Configuration,Wcf Binding,我刚刚增加了ServiceContract中的方法数量。在Visual Studio中更新服务引用时,会收到以下消息: 元数据包含无法解析的引用: “净。tcp://xxxxx.com:8002/DataQueryService/mex" XML文档中存在错误 最大名称表字符数 读取XML数据时已超过计数配额(16384)。这个 nametable是一种数据结构,用于存储在存储过程中遇到的字符串 XML处理—具有非重复元素名称的长XML文档, 属性名称和属性值可能触发此配额。这 可以通过更改Ma

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

元数据包含无法解析的引用: “净。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>

这将有助于:
解决方案似乎是为svcuti创建一个配置文件,并将其放在与其相同的文件夹中。

我认为将操作拆分为多个契约并不实际?介意我问一下我们在谈论多少服务运营吗

你试过这篇文章中的解决方案吗?

其他建议包括使用发现协议读取元数据,该协议没有任何读卡器配额:

底部的解决方案建议您在启动服务之前更改代码中的默认读卡器配额。我相信这必须在定制ServiceHost工厂中完成。如果你愿意帮忙,请告诉我


希望这有帮助。

尝试通过编程方式设置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);
注意:必须在创建客户端代理和/或服务主机之前进行设置。一旦创建,它们就无法更改。


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

谢谢。我为SvcUtil.exe添加了一个配置文件,上面已经详细介绍了该文件。然而,我仍然得到相同的错误。这只是我需要更改的SvcUtil文件还是服务器端的文件?您应该只更改消费应用程序OK,我尝试修改SvcUtil的配置文件(如上所述)但它仍然不起作用。可能您的消息太大或由太多的xml元素/属性组成?是操作契约的数量增加了。这就是问题的原因。你正在使用什么版本的WCF(双方)?谢谢,我已经看过了你给出的第一个链接。我们的解决方案可能已经太成熟,无法按照建议更改发现方法。我已经看到其他人成功地改变了ReaderQuota,所以我也愿意这样做。这意味着只需对配置文件进行几行更改。当您说“在定制ServiceHost工厂中”,这是什么意思?无法在配置文件中执行此操作吗?此页介绍如何创建自定义服务主机,以便在读取配置文件的同时对服务执行某些自定义配置,包括如何与IIS一起使用。这将允许您在创建服务之前设置读卡器配额,我认为这是问题的根源,也是为什么不能仅在配置文件中完成这项工作的原因。祝你好运我认为SvcUtil.exe和Visual Studio服务引用仍然不能与此解决方案配合使用,这是对的。我们的构建过程是自动化的,实际上构建也是失败的,所以我需要找到一个解决方案,在那里我可以修改配置文件。许多其他人通过修改客户端配置文件成功地克服了这个问题。我只是想找出我的配置文件中有哪些错误。我想指出的是,在第一个链接的页面底部有一些代码为我解决了这个问题。我正在使用IIS6,必须使用反射来增加System.ServiceModel中ReaderQuotas中的MaxNameTableCharCount。我无法在配置中修复,谢谢。我们的构建过程是自动化的,实际上构建也失败了,所以我需要找到一个解决方案,在那里我可以修改配置文件。许多其他人通过修改客户端配置文件成功地克服了这个问题。我只是想找出我的配置文件中有哪些错误。您的错误消息是否仍然显示:“最大nametable字符计数配额(16384)”。我说试试这个,因为它看起来不像是在读取你的新值(16384而不是2147483647)。有一次我遇到了类似的问题,但是从配置文件中更改它是不起作用的,但是它在运行时起作用。按照构建脚本的设置方式,我需要在配置文件中指定该值。它通过更改配置为其他用户工作。有什么原因使它不适用于我吗?谢谢Bart,但我已经将该值从默认值16384增加到整数的最大值2147483647。