WCF - Как увеличить квоту на размер сообщения

401

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

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

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

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

  • 0
    У меня была та же проблема, но я только что получил недружелюбную сетевую ошибку 400, но решение было в размер сообщения ...
  • 2
    Я решил проблему, используя шаги, упомянутые в [ссылка] [1] [1]: stackoverflow.com/questions/7476853/…
Показать ещё 2 комментария
Теги:
wcf
.net-3.5

12 ответов

523
Лучший ответ

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

  • 19
    Спасибо. Это изменение необходимо внести в файл web.config клиентского приложения.
  • 7
    Вам также может понадобиться изменить его на сервере - в случае, если вам нужно отправить большой набор данных в качестве параметра в метод WCF.
Показать ещё 20 комментариев
132

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

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

  • Щелкните правой кнопкой мыши файл Config node в нижней части дерева
  • Выберите "Редактировать" с помощью SvcConfigEditor

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

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

  • 7
    Почему я всегда об этом забываю? +1
  • 7
    На vs2013 SvcConfigEditor заменяется на Изменить конфигурацию WCF, если люди ищут ее.
Показать ещё 4 комментария
79

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

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = 2147483647;
httpBinding.MaxBufferSize = 2147483647;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = 2147483647;
  • 1
    Где я могу использовать этот код?
  • 0
    Вы можете использовать его для инициализации. Понятно, что вы можете использовать его как конструктор.
37

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

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

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

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

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

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

  • 2
    Наверное, лучший ответ здесь!
  • 3
    upvote из-за примечания, чтобы снять флажок Always regenerate config параметр.
Показать ещё 3 комментария
12

Я нашел простой способ

--- щелкните правой кнопкой мыши файл конфигурации webconfig или app и нажмите EDIT CONFIGURATION WCF и получите доступ к bingdigs ans select yore service и right side show maxReciveMessageSize дает большое количество ---

  • 2
    Это был отличный ответ, я не знал, что я могу редактировать отсюда, спасибо
7

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

    <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>
  • 18
    Чем это отличается от моего решения? Кроме того, что вы включили все несущественные части вашей конфигурации, а также соответствующие части, и вы выбрали максимально возможное значение вместо 200 м, которые я выбрал?
  • 3
    Контекст тоже хорош ... может быть, эти два ответа можно объединить?
Показать ещё 1 комментарий
6

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

Я установил в файле applications.config(например, 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>
6

<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>

  • 0
    Отлично подходит для размещения вашего ответа. Важно, чтобы значение «bindingConfiguration» соответствовало имени привязки. В вашем примере "wsHttpBinding_Username".
2

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

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

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

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

2

Не забывайте, что будет рассмотрен app.config точки ввода выполнения, а не тот, который в проекте библиотеки классов управляет вызовами Web-Service, если он есть.

Например, если вы получаете ошибку при запуске unit test, вам необходимо настроить соответствующую конфигурацию в проекте тестирования.

1

Для HTTP:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000" 
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="200" 
             maxArrayLength="200000000"
             maxBytesPerRead="4096"
             maxStringContentLength="200000000"
             maxNameTableCharCount="16384"/>
    </binding>
  </basicHttpBinding>
</bindings>

Для TCP:

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="200"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"
           maxBytesPerRead="4096"
           maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

ВАЖНО:

Если вы пытаетесь передать сложный объект с множеством связанных объектов (например: структура данных дерева, список, который имеет много объектов...), связь будет терпеть неудачу независимо от того, как вы увеличили количество квот. В таких случаях вы должны увеличить количество объектов:

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      ...
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
1

Я получил эту ошибку при использовании этих настроек в web.config

System.ServiceModel.ServiceActivationException

i задайте такие настройки следующим образом:

      <service name="idst.Controllers.wcf.Service_Talks">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
      binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
  </service>
  <service name="idst.Controllers.wcf.Service_Project">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
      binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
      contract="idst.Controllers.wcf.Service_Project" />
  </service>
</services>

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

  • 3
    Итак, вы исправили свою проблему, используя ответ Нейта, а затем опубликовали его как свой собственный. Не круто.
  • 0
    Ответ @arcain Nates был очень общим, с использованием названий акций и цифр, которые можно ожидать часто. Этот ответ не был украден, это просто правильный ответ. Поскольку есть только один правильный ответ, его обязательно нужно будет повторить.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню