Максимальная квота числа именных символов (16384) была превышена при чтении данных XML - PullRequest
2 голосов
/ 23 марта 2010

Когда я пытаюсь прочитать метаданные, я получаю эту ошибку, любая идея здесь Мой код

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

Ответы [ 4 ]

6 голосов
/ 01 августа 2011

Если вы выполняете «Обновление справочника» в 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 голосов
/ 23 марта 2010

Это ошибка в коде Microsoft, Http-Get не поддерживает квоты Reader, поэтому мы можем сделать это

      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; 
0 голосов
/ 12 февраля 2014

Проблема, похоже, исправлена ​​в .NET 4.0. Согласно Reflector, MetadataExchangeClient теперь считывает квоты из предоставленной привязки, и если он не имеет их, он возвращается к EncoderDefaults. Ранее я думаю, что он использовал только EncoderDefaults, поэтому решение @ BreakHead представляется единственным решением (изменить EncoderDefaults с помощью отражения).

0 голосов
/ 23 марта 2010

Вы пытались увеличить любое из этих других значений внутри binding.ReaderQuotas сверх их значений по умолчанию:

maxDepth, maxStringContentLength, maxArrayLength, maxBytesPerRead?

Это также может быть maxBufferPoolSize binding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...