• WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while reading XML data错误


    在服务端中定义接口太多时,在客户端的服务引用时,报错误:

     元数据包含无法解析的引用:“net.tcp://localhost:8081/BaseData/mex”。    XML 文档中有错误。    读取 XML 数据时,超出最大名称表字符计数配额 (16384)。名称表是用于存储在处理 XML 时所遇到的字符串的数据结构 - 具有非重复元素、属性名称和属性值的长 XML 文档可能会触发此配额。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的  MaxNameTableCharCount 属性,可增加此配额。

    解决方法:

    服务端配置文件:

    <system.serviceModel>
        <services>
          <!--基础数据服务-->
          <service name="PmsWcfServer.PmsWcfBaseData" behaviorConfiguration="WcfBaseData">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://127.0.0.1:8081"/>
              </baseAddresses>
            </host>
            <endpoint address="" binding="netTcpBinding"  contract="PmsWcfServer.IPmsWcfBaseData" bindingConfiguration="BindBaseData"/>
            <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfBaseData">
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceMetadata httpGetEnabled="false"/>
              <serviceCredentials>
                <serviceCertificate x509FindType="FindBySubjectName" findValue="PmsWcfServer" storeLocation="LocalMachine"/>
                <userNameAuthentication userNamePasswordValidationMode="Custom"  customUserNamePasswordValidatorType="PmsWcfServer.CheckUserNamePass,PmsWcfServer"/>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
          
          <endpointBehaviors>
            <behavior name="BindBaseData">
              <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        
        <bindings>
          <netTcpBinding>
            <binding name="BindBaseData" maxReceivedMessageSize="2147483647">
              <security mode="Message">
                <message clientCredentialType="UserName"/>
              </security>

    <!--注意:红色字体,这里必须要修改maxNameTableCharCount值,增大配额--> 

              <readerQuotas maxNameTableCharCount="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxDepth="32000"/>
            </binding>
          </netTcpBinding>
        </bindings>
      </system.serviceModel>

        只是修改以上配置文件,客户端依然后引用不成功,还需要修改:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config文件,在文件后面增加以下节:

       <system.serviceModel>  
        <bindings>  
          <netTcpBinding>  
            <binding name="BindSystem" maxBufferPoolSize="2147483647"  
              maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">  
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"  
                maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />  
              <security mode="None" />  
            </binding>  
          </netTcpBinding>  
        </bindings>  
        <client>  
          <endpoint binding="netTcpBinding" bindingConfiguration="BindSystem"  
            contract="IMetadataExchange" name="net.tcp" />  
        </client>  

      </system.serviceModel> 

    重启VS,后再次引用成功! 

  • 相关阅读:
    项目开发中需要注意的
    数据库函数
    C#中 ?. 运算符
    字符串格式化String.Format
    day37 进程理论 多进程
    36 网络编程---操作系统 并发
    day35 socket的常用方法,
    day34
    day33天 网络编程udp pycharm控制台输出带颜色
    day32 网络编程初识
  • 原文地址:https://www.cnblogs.com/y740504/p/2323235.html
Copyright © 2020-2023  润新知