Максимальный размер квоты для входящих сообщений (65536) .... Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize - PullRequest
18 голосов
/ 05 декабря 2011

У меня сумасшедшая проблема, с которой я пытаюсь разобраться. Я знаю, что когда мы получаем огромное количество данных, мы должны увеличить квоту на клиентский файл .config, но что мне делать, если мой клиент отправляет огромные данные «на» сервер WCF?

Это работает совершенно нормально, когда я посылаю входной параметр небольшого размера. К сожалению, это ломается, когда входные данные становятся больше.

Отладчик говорит:

Неверный запрос, 400;

в файле трассировки это:

Максимальная квота размера сообщения для входящих сообщений (65536) имеет был превышен. Чтобы увеличить квоту, используйте MaxReceivedMessageSize свойство соответствующего связующего элемента.

Есть ли какой-нибудь способ увеличить эту квоту поступающих данных на стороне сервера? если да, то как?

Вот мой пример связанных частей конфигурации:

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

  </basicHttpBinding>
</bindings>

 <services>
  <service name="MyWcfService">
    <endpoint address="http://myservice..."
      binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding"
      name="MyBasicHttpBinding" contract="IMyContract" />
  </service>
</services> 

и вот мой клиентский код (я создаю его динамически):

        var binding = new BasicHttpBinding();
        binding.MaxBufferPoolSize = 2147483647;
        binding.MaxBufferSize = 2147483647;
        binding.MaxReceivedMessageSize = 2147483647;
        binding.ReaderQuotas.MaxStringContentLength = 2147483647;
        binding.ReaderQuotas.MaxArrayLength = 2147483647;
        binding.ReaderQuotas.MaxDepth = 2147483647;
        binding.ReaderQuotas.MaxBytesPerRead = 2147483647;


        var address = new EndpointAddress("http://mylocalservice.."); 

        ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address);

        foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
        {
            DataContractSerializerOperationBehavior dataContractBehavior =
                        op.Behaviors.Find<DataContractSerializerOperationBehavior>()
                        as DataContractSerializerOperationBehavior;
            if (dataContractBehavior != null)
            {
                dataContractBehavior.MaxItemsInObjectGraph = 2147483646;
            }
        }
        public IMyContract MyClientObject = factory.CreateChannel();

Ответы [ 3 ]

40 голосов
/ 05 декабря 2011

Вы можете установить свойство MaxReceivedMessageSize в службе через файл конфигурации службы.

Установка клиентом MaxReceivedMessageSize влияет только на сообщения , полученные клиентом;это не влияет на сообщения, полученные сервисом.Соответственно, чтобы служба могла получать большие сообщения, вам необходимо установить файл конфигурации службы.

Пример конфигурации службы

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="MyBinding" maxReceivedMessageSize="2147483647" />
    </wsHttpBinding>
  </bindings>
  <services>
    <service name="MyService">
      <endpoint address="http://myservice" binding="wsHttpBinding"
                bindingConfiguration="MyBinding" contract="IMyServiceContract" />
    </service>
  </services>
</system.serviceModel>

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

6 голосов
/ 24 октября 2014

Моя проблема была с тестовым клиентом wcf. По какой-то причине он не будет генерировать конфигурацию клиента с увеличенным значением maxReceivedMessageSize. Мое исправление состояло в том, чтобы щелкнуть правой кнопкой мыши «Config file» -> «Edit with SvcConfigEditor» -> bindings -> maxReceivedMessageSize.

5 голосов
/ 07 августа 2013

Эту проблему можно решить, добавив указанный ниже дополнительный узел привязки в раздел привязки файла конфигурации.

<basicHttpBinding>
  <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
  </binding>
</basicHttpBinding>
...