WCF: превышена максимальная квота количества символов в таблице имен (16384) при чтении XML-данных.

StackOverflow https://stackoverflow.com/questions/2765598

Вопрос

У меня есть служба WCF, которая использует wsHttpBinding.Конфигурация сервера следующая:

<bindings>
      <wsHttpBinding>
        <binding name="wsHttpBinding" maxBufferPoolSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

На стороне клиента я включаю ссылку на службу WCF-Service.Это отлично работает, если у меня есть ограниченные функции, скажем, 90 контрактов операций в моем IService, но если добавить еще один контракт OperationContract, я не смогу ни обновить ссылку на службу, ни добавить эту ссылку на службу.В этот В статье упоминается, что при изменении этих файлов конфигурации (например, devenv.exe.config, WcfTestClient.exe.config и SvcUtil.exe.config) все будет работать, но даже при включении этих привязок в эти файлы конфигурации все равно появляется ошибка, говорящая

Произошла ошибка при загрузке 'http://10.0.3.112/MyService/Service1.svc/mex'.Запрос не выполнен со статусом HTTP 400:Неверный запрос.Метаданные содержат ссылку, которую невозможно разрешить:'http://10.0.3.112/MyService/Service1.svc/mex'.В XML-документе имеется ошибка (1, 89549).При чтении XML-данных превышена максимальная квота числа символов таблицы имен (16384).Таблица имен — это структура данных, используемая для хранения строк, встречающихся во время обработки XML. Длинные документы XML с неповторяющимися именами элементов, именами атрибутов и значениями атрибутов могут активировать эту квоту.Эту квоту можно увеличить, изменив свойство MaxNameTableCharCount объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML.Строка 1, позиция 89549.Если служба определена в текущем решении, попробуйте создать решение и снова добавить ссылку на службу.

Есть идеи как это решить????

Это было полезно?

Решение

Попробуйте следующее:

В каталоге установки вашей Visual Studio, где расположен devenv.exe (например, C: Program Files Microsoft Visual Studio 9.0 Common7 IDE) Добавьте этот раздел в Devenv.exe.cofig

<system.serviceModel>
<client>
  <endpoint binding="customBinding" bindingConfiguration="largeServiceBinding" contract="IMetadataExchange" name="http" />
</client>

<bindings>
  <customBinding>
    <!-- NOTE: The binding name must be the same as specified in the config file of the wcf service -->
    <binding name="largeServiceBinding" >
      <textMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </textMessageEncoding>

      <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
    </binding>

  </customBinding>
</bindings>
</system.serviceModel>

В App.config вашего WCF-Service Добавьте одинаковое связывание:

<bindings>
  <customBinding >
    <!-- NOTE: The binding name must be the same as specified in the devenv.exe.config file located ..\Common7\IDE folder of the VS installation directory -->
    <binding name="largeServiceBinding" >
      <textMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
          maxNameTableCharCount="2147483647" />
      </textMessageEncoding>
      <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
    </binding>
  </customBinding>
</bindings>

Обратите внимание, что атрибут имени тегов связывания из двух файлов должен совпадать (например, лицсервисцизирование)

Наконец добавьте следующую конечную точку Mex в свой сервисный тег:

 <endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/>

Это может выглядеть так:

 <services>
  <service behaviorConfiguration="MyServiceBehavior"
    name="MyService.MyService">
    <endpoint address="" binding="wsHttpBinding" contract="MyService.IMyService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/Design_Time_Addresses/MyService/MyService/" />
      </baseAddresses>
    </host>
  </service>
</services>

Другие советы

Я знаю, что прошло много времени, но у меня возникла та же проблема, и я нашел другое (более простое) решение. в кодпроекте

В приведенном там решении значения задаются в коде, а не в файле .config.

        BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.Transport;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        binding.MaxReceivedMessageSize = 50000000;
        binding.ReaderQuotas.MaxArrayLength = 50000000;
        binding.ReaderQuotas.MaxStringContentLength = 50000000;
        binding.ReaderQuotas.MaxNameTableCharCount = 50000000;
        EndpointAddress endpoint = new EndpointAddress(new Uri("https://server/EWS/Exchange.asmx"));
        ExchangeServicePortTypeClient ews = new ExchangeServicePortTypeClient(binding, endpoint);

Однако я изменил значения соответствующих значений в файле .config (как в <binding> и <readerQuotas> разделы) и решил проблему (вместо добавления пользовательских привязок):

                <binding name="ITransactionProcessor" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="50000000" maxBufferPoolSize="524288" maxReceivedMessageSize="50000000"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="50000000" maxArrayLength="50000000"
                        maxBytesPerRead="4096" maxNameTableCharCount="50000000" />
                    <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="None" proxyCredentialType="None" 
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>

Надеюсь, это кому-нибудь поможет :)

Одна вещь, чтобы узнать, что сообщение относится к квотам читателя Svcutil не сервисных! Svcutil имеет ограничение на то, сколько метаданных он может прочитать. Этот предел может быть изменен с помощью файла конфигурации. Решение состоит в том, чтобы создать файл конфигурации для SVCUTIL и поместить его в одну и ту же папку, что и инструмент. В следующий раз, когда вы запустите SVCUTIL, будут учитываться значения файлов конфигурации.

http://geekswithblogs.net/ClaraOscura/Archive/2007/08/20/114806.aspx.

В вашем app.config или dll.config на клиент добавить:

<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="myMex" maxReceivedMessageSize="1024000"> <!-- modify this to avoid stupid error -->
<readerQuotas maxNameTableCharCount="163840" /> <!-- DO NOT touch this one -->
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>

...

<client>
<endpoint binding="netTcpBinding" bindingConfiguration="myMex"
contract="IMetadataExchange" name="net.tcp" />

...

        </client>
    </system.serviceModel>
</configuration>

И там вы идете! Это одно из действительно раздражающих вещей с WCF и так часто Google просто дает вам много BS. Впустую тонны времени с этим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top