Квота максимального размера сообщения для входящих сообщений (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();

person rockin'    schedule 05.12.2011    source источник
comment
Я решил проблему с помощью шага, упомянутого [здесь] [1] [1]: stackoverflow.com/questions/7476853/   -  person Ram    schedule 28.12.2011
comment
В коде на стороне клиента вы устанавливаете значения для читателей с помощью кода, поэтому ниже представлен подход к их установке: XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas (); myReaderQuotas.MaxStringContentLength = 2147483647; myReaderQuotas.MaxArrayLength = 2147483647; myReaderQuotas.MaxBytesPerRead = 2147483647; myReaderQuotas.MaxDepth = 64; myReaderQuotas.MaxNameTableCharCount = 2147483647; binding.GetType (). GetProperty (ReaderQuotas) .SetValue (binding, myReaderQuotas, null);   -  person Rajesh    schedule 05.07.2013
comment
Отвечает ли это на ваш вопрос? Квота максимального размера сообщения для входящих сообщений (65536) превышено   -  person KyleMit    schedule 05.11.2019


Ответы (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 в элементе конечной точки.

person Tim    schedule 05.12.2011
comment
дело в том, что я не вижу какой-либо конфигурации привязки на стороне сервера. есть ли какая-то привязка по умолчанию или что-то в этом роде? как я могу отменить это? - person rockin'; 05.12.2011
comment
Да, есть. Если у вас нет определенного раздела привязки в вашем файле конфигурации, и он не упоминается в элементе <endpoint> через атрибут bindingConfiguration, будут использоваться значения по умолчанию для привязки (что составляет 65536 для свойства MaxReceivedMessageSize). Поэтому вам нужно добавить соответствующий раздел <binding> в config. - person Tim; 05.12.2011
comment
есть ли какой-либо пример привязки на стороне сервера и / или конфигурации конечной точки? Я уже застрял в этой точке. - person rockin'; 05.12.2011
comment
@rockin '- Опубликуйте, пожалуйста, конфигурационный файл вашего сервиса. - person Tim; 05.12.2011
comment
@rockin '- конфигурационный файл выглядит правильно. Как вы создаете прокси на клиенте? Можете ли вы добавить этот фрагмент кода к своему вопросу? В зависимости от того, как вы его создаете, может быть, в этом и заключается проблема. Я, наверное, смогу сказать наверняка, как только увижу код. - person Tim; 06.12.2011
comment
Как сделать настройку в MaxReceivedMessageSize клиента, когда клиент - MS Excel? - person Anil Soman; 08.05.2014
comment
Привет всем, Есть ли альтернативные способы передачи больших данных ч / б клиенту и серверу - person user1915370; 19.09.2017

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

person thebiggestlebowski    schedule 24.10.2014
comment
в большинстве ответов они показывают, как установить эти настройки на сервере. но если по-прежнему ошибка, то, как вы упомянули, мы также должны настроить эти параметры на клиенте. в моем случае app.config приложения, которое использует веб-сервис, сначала выглядело так: ‹bindings› ‹basicHttpBinding› ‹имя привязки = BasicHttpBinding_ICGSIncomingSOAPCalls /› ‹имя привязки = BasicHttpBinding_MyICGSIncomingSOAPCalls/› ‹/basicHttpBings вот так (см. часть 2): - person mihai71; 17.05.2017
comment
... часть 2: <привязок> <имя привязки = BasicHttpBinding_ICGSIncomingSOAPCalls MaxReceivedMessageSize = 10485760 maxBufferPoolSize = 10485760 MaxBufferSize = 10485760 /> <связывании имя = BasicHttpBinding_MyICGSIncomingSOAPCalls MaxReceivedMessageSize = 10485760 maxBufferPoolSize = 10485760 MaxBufferSize = 10485760 /> - person mihai71; 17.05.2017

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

<basicHttpBinding>
  <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
  </binding>
</basicHttpBinding>
person Amit S    schedule 06.08.2013
comment
Добро пожаловать в StackOverflow. OP имеет очень похожий код в своей конфигурации. Чем ваш ответ лучше того, что было у них? Вы можете улучшить свой ответ, объяснив, что ответ делает то, чего раньше не делали. - person carlosfigueira; 07.08.2013