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

У меня сумасшедшая проблема, с которой я пытаюсь разобраться. Я знаю, что когда мы получаем огромное количество данных, мы должны увеличить квоту на клиентский файл.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 ответа

Решение

Вы можете установить 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 в элементе конечной точки.

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

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

<basicHttpBinding>
  <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
  </binding>
</basicHttpBinding>
Другие вопросы по тегам