【问题标题】:The maximum nametable character count quota (16384) has been exceeded while reading XML data读取 XML 数据时已超出最大可命名字符数配额 (16384)
【发布时间】:2011-01-30 19:36:33
【问题描述】:

当我尝试读取元数据时出现此错误,这里的任何想法都是我的代码

WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
binding.MaxReceivedMessageSize = Int32.MaxValue; // DPNote: This may actually be too big.  see how it performs.
binding.ReaderQuotas.MaxNameTableCharCount = 99999999;

MetadataExchangeClientMode exchangeMode = MetadataExchangeClientMode.HttpGet; // Default to a HttpGET
metaClient = new MetadataExchangeClient(binding);
metaClient.MaximumResolvedReferences = 10 * 100; //DPNote: Some arbitrary number.  Default is 10, so this is bigger.


if (address.Scheme == "http")
  exchangeMode = MetadataExchangeClientMode.HttpGet;
else if (address.Scheme == "https")
  exchangeMode = MetadataExchangeClientMode.HttpGet;
else
  exchangeMode = MetadataExchangeClientMode.MetadataExchange;

MetadataSet metadata = metaClient.GetMetadata(address, exchangeMode);
MetadataImporter importer = new WsdlImporter(metadata);

这是引发错误的行

MetadataSet metadata = metaClient.GetMetadata(address, exchangeMode);

【问题讨论】:

    标签: c# .net wcf wsdl


    【解决方案1】:

    如果您通过 Visual Studio 执行“更新参考”,请将这些行添加到 devenv.exe.config

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

    【讨论】:

    • 谢谢谢谢谢谢!你用这个解决方案拯救了我的一天(甚至一周)!
    【解决方案2】:

    这是微软代码的错误,Http-Get不支持Reader Quotas,所以我们可以这样做

          var smAsm = AppDomain.CurrentDomain.GetAssemblies().First(a => a.FullName.StartsWith("System.ServiceModel,"));
            var defTy = smAsm.GetType("System.ServiceModel.Channels.EncoderDefaults");
            var rq = (System.Xml.XmlDictionaryReaderQuotas)defTy.GetField("ReaderQuotas", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null);
            rq.MaxArrayLength = int.MaxValue;
            rq.MaxDepth = int.MaxValue;
            rq.MaxNameTableCharCount = int.MaxValue;
            rq.MaxStringContentLength = int.MaxValue; 
    

    【讨论】:

      【解决方案3】:

      您是否尝试过将binding.ReaderQuotas 内的任何其他值增加到超出其默认值:

      maxDepth、maxStringContentLength、maxArrayLength、maxBytesPerRead?

      也可以是binding的maxBufferPoolSize

      【讨论】:

      【解决方案4】:

      这个问题似乎在 .NET 4.0 中得到解决。根据 Reflector 的说法,MetadataExchangeClient 现在从提供的绑定中读取配额,如果没有,它会回退到 EncoderDefaults。以前,我认为它只使用了 EncoderDefaults,这就是为什么 @BreakHead 的解决方案似乎是唯一的解决方案(通过反射更改 EncoderDefaults)。

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 2012-10-15
        相关资源
        最近更新 更多