5

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

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

XML 文档中存在错误。

读取 XML 数据时已超出最大可命名字符计数配额 (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>
4

4 回答 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"

于 2013-08-23T22:38:23.530 回答
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 工厂中完成。如果您愿意提供帮助,请告诉我。

希望这可以帮助。

于 2013-08-19T12:59:45.667 回答
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);

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

于 2013-08-23T08:25:55.963 回答
0

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

于 2013-08-15T07:26:43.987 回答