WCF-при чтении XML-данных превышена максимальная квота количества именуемых символов (16384)
У меня есть служба 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.исполняемый.config, WcfTestClient.исполняемый.config и SvcUtil.исполняемый.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. Если службы определяется в текущих решений, попробуйте построить решение, и добавить ссылку на службу.
есть идеи, как это решить????
4 ответов
попробуйте следующее:
в каталоге установки вашей Visual Studio, где devenv.exe находится (например C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE) добавьте этот раздел в devenv.исполняемый.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>
в приложение.конфигурация вашей WCF-службы добавляет ту же привязку:
<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>
обратите внимание, что атрибут name тегов привязки из двух файлов должен соответствовать (например largeServiceBinding)
наконец, добавьте следующую конечную точку 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>
Я знаю, что прошло некоторое время, но я получил ту же проблему и нашел другое (более простое) решение в codeproject
в данном решении значения задаются в коде, а не в коде .конфигурационный файл.
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 имеет ограничение на количество метаданных, которые он может читать. Этот лимит можно изменить в файле config. Решение состоит в том, чтобы создать файл конфигурации для svcutil и поместить его в ту же папку, что и инструмент. При следующем запуске svcutil будут учтены значения файла конфигурации.
http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx
в вашем приложении.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. Потратил кучу времени на это.