Ошибка вызова службы WCF REST с использованием JSON.превышена квота длины (8192)

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

Вопрос

У меня есть служба WCF REST, размещенная в IIS с использованием .NET 4 RC.Вызовы POST к службе сериализуются с помощью JSON.Все работает нормально до тех пор, пока размер одного из элементов данных (string) не превысит 8 КБ.В этом случае я получаю описанную ниже ошибку, указывающую на превышение MaxStringContentLength.Атрибут MaxStringContentLength для конечной точки был увеличен, и он корректно считывается из файла конфигурации.

Веб-конфигурация - это:

<services>
  <service name="MyServiceServer" >
    <endpoint address="http://localhost/MyService" kind="webHttpEndpoint" endpointConfiguration="serviceEndPoint" contract="IMyService">
    </endpoint>
  </service>
</services>

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="serviceEndPoint" maxReceivedMessageSize="2048000"  maxBufferSize="2048000" maxBufferPoolSize="0">
      <readerQuotas maxStringContentLength="2048000" maxArrayLength="2048000"  maxDepth ="65000"/>
      <security mode="None">
        <transport clientCredentialType="None"/>
      </security>
    </standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>

Интерфейс IMyService определяется как:

public interface IMyService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/request", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    void MyMehod(<Class Type> obj);
}

Полное сообщение об ошибке является:

“Сервер столкнулся с ошибкой при обработке запроса.Сообщение об исключении выглядит следующим образом : "Произошла ошибка десериализации объекта типа .При чтении XML-данных была превышена максимальная квота длины содержимого строки (8192).Эта квота может быть увеличена путем изменения свойства MaxStringContentLength объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML.'.Смотрите журналы сервера для получения более подробной информации.Трассировка стека исключений - это:в System.Runtime.Сериализация.XmlObjectSerializer.Исключения ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver DataContractResolver) в System.Runtime.Сериализация.Json.DataContractJsonSerializer.readObject(XmlDictionaryReader средство чтения, логическое имя проверяемого объекта) в системе.ServiceModel.Диспетчер.Параметр SingleBodyParameterMessageFormatter.Запрос десериализации (сообщение message, параметры Object[]) в системе.ServiceModel.Диспетчер.Демультиплексирование dispatchmessageformatter.Запрос десериализации (сообщение message, параметры Object[]) в системе.ServiceModel.Диспетчер.UriTemplateDispatchFormatter.Запрос десериализации (сообщение message, параметры Object[]) в системе.ServiceModel.Диспетчер.DispatchOperationRuntime.Десериализуйте входные данные (MessageRpc & rpc) в системе.ServiceModel.Диспетчер.DispatchOperationRuntime.Запуск вызова (MessageRpc & rpc) в системе.Модель обслуживания.Диспетчер.Неизменяемое время выполнения.ProcessMessage5 (MessageRpc & rpc) в системе.Модель обслуживания.Диспетчер.Неизменяемое время выполнения.ProcessMessage31(MessageRpc & rpc) в системе.ServiceModel.Диспетчер.MessageRpc.Process(логический набор isOperationContextSet)”

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

Решение

Это работает, просто убедитесь, что в качестве адреса вашей конечной точки указан полный абсолютный URL.Если вы проявите хитрость и попытаетесь использовать относительный путь, или если вы опустите .svc, это приведет к ошибке strange reader quota, как только запрос станет слишком большим --

Я бы подал это под ошибкой для WCF, потому что либо:

  1. относительные URL-адреса должны быть запрещены (и выдано соответствующее исключение).

или

  1. квота reader также должна работать с относительными путями

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

Вставьте в свой web.config:

<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig">
          <readerQuotas maxStringContentLength="2048000" />
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

и вставьте атрибут bindingConfiguration="webHttpBindingConfig" в вашу конечную точку

У меня были похожие проблемы, но с .NET 3.5

У меня не было никаких проблем с журналом сервера, так что проблема была в клиенте.Похоже, что конфигурация с увеличенными максимальными значениями не была прочитана и использована...

Итак, я решил передать имя конечной точки ЯВНО в конструкторе WebChannelFactory, используя другую перегрузку.

БЫЛ:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>(new Uri(XXX));
factory.Credentials.UserName.UserName = K_USERNAME;
factory.Credentials.UserName.Password = K_PASSWORD;
IWKRestTest proxy = factory.CreateChannel();

ЯВЛЯЕТСЯ:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>("IWKRestTestService");

и в app.config есть:

Uri указан в конечном узле, но там вы также найдете bindingConfiguration и так далее, так что все новые увеличенные ограничения теперь работают.

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