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

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

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

        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 элемента endpoint.


моя проблема была с тестовым клиентом wcf. По какой-то причине он не будет генерировать конфигурацию клиента с увеличенным maxReceivedMessageSize. Мое исправление было нажав "файл конфигурации" -> "редактировать с SvcConfigEditor" -> привязки -> значение maxreceivedmessagesize.


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

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