WCF - Как увеличить квоту на размер сообщения - PullRequest
438 голосов
/ 19 мая 2009

У меня есть служба WCF, которая возвращает 1000 записей из базы данных клиенту. У меня есть клиент ASP.NET WCF (я добавил ссылку на сервис в проекте веб-приложения asp.net для использования WCF).

При запуске клиентского приложения появляется следующее сообщение:

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

Любая помощь? Как увеличить квоту на размер сообщения?

Ответы [ 13 ]

572 голосов
/ 19 мая 2009

Вы хотите, чтобы что-то подобное увеличивало квоты на размер сообщения в файле App.config или Web.config :

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

И используйте имя привязки в вашей конфигурации конечной точки, например,

...
bindingConfiguration="basicHttp"
...

Обоснование значений простое, они достаточно велики, чтобы вместить большинство сообщений. Вы можете настроить это число под свои нужды. Низкое значение по умолчанию в основном используется для предотвращения атак типа DOS. Установка 20000000 позволит обеспечить эффективную атаку распределенной DOS, по умолчанию размер 64 КБ потребует очень большого числа клиентов для подавления большинства серверов в наши дни.

147 голосов
/ 05 августа 2010

Если вы все еще получаете это сообщение об ошибке при использовании тестового клиента WCF, это потому, что у клиента есть отдельная настройка MaxBufferSize .

Чтобы исправить проблему:

  1. Щелкните правой кнопкой мыши узел Файл конфигурации в нижней части дерева
  2. Выберите Изменить с помощью SvcConfigEditor

Появится список редактируемых настроек, включая MaxBufferSize.

Примечание: Автоматически сгенерированные прокси-клиенты также устанавливают для MaxBufferSize значение 65536 по умолчанию.

91 голосов
/ 02 февраля 2011

Если вы динамически создаете привязки WCF, вот код для использования:

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;
43 голосов
/ 28 июня 2012

Тестовый клиент WCF имеет собственную конфигурацию клиента.

Запустите тестовый клиент и прокрутите вниз. Если дважды щелкнуть узел «Файл конфигурации», вы увидите представление XML. Как видите, maxReceivedMessageSize это 65536.

Чтобы изменить это, щелкните правой кнопкой мыши узел дерева файла конфигурации и выберите «Редактировать с помощью SvcConfigEditor». Когда редактор откроется, разверните узел «Привязки» и дважды щелкните автоматически созданную привязку.

Здесь вы можете редактировать все свойства, включая maxReceivedMessageSize. Когда вы закончите, нажмите Файл - Сохранить .

Наконец, когда вы вернетесь в окно тестового клиента WCF, нажмите Инструменты - Параметры .

ПРИМЕЧАНИЕ : Снимите флажок Всегда регенерировать конфигурацию при запуске служб .

18 голосов
/ 30 марта 2015

Я нашел легкий путь

--- щелкните правой кнопкой мыши файл конфигурации webconfig или приложения и выберите РЕДАКТИРОВАТЬ КОНФИГУРАЦИЮ WCF и перейдите к bingdigs и выберите ваш сервис и нажмите побочные шоу maxReciveMessageSize дают большое число ---

8 голосов
/ 11 мая 2013

Я решил свою проблему в Bing Maps WPF в своем проекте с помощью CalculateRoute (). Решением в моем случае было установить maxReceivedMessageSize и maxReceivedMessageSize для атрибута «httpTransport» для раздела «customBinding».

Я установил в файле application.config (es. MyApp.config) эту конфигурацию:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IGeocodeService" />
            <binding name="BasicHttpBinding_IRouteService" />
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_IGeocodeService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
            <binding name="CustomBinding_IRouteService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
            contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
            contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
    </client>
</system.serviceModel>
8 голосов
/ 22 марта 2011

Я решаю проблему ... следующим образом

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>
6 голосов
/ 26 января 2012

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>

4 голосов
/ 24 июля 2018

Для меня все, что мне нужно было сделать, это добавить maxReceivedMessageSize="2147483647" в клиентский app.config. Сервер остался нетронутым.

4 голосов
/ 24 октября 2016

Еще один важный момент, который следует учитывать из моего опыта ..

Я бы настоятельно рекомендовал НЕ максимизировать maxBufferPoolSize, поскольку буферы из пула никогда не освобождаются до тех пор, пока домен приложения (то есть пул приложений) не перезапустится.

Период большого трафика может привести к использованию большого количества памяти и никогда не освобождаться.

Подробнее здесь:

...