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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = 2147483647;
httpBinding.MaxBufferSize = 2147483647;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = 2147483647;

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Я решил проблему на 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>

Ответ 9

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

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

Ответ 10

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

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

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

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

Ответ 11

Я получил эту ошибку при использовании этих настроек в 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>

Ответ 12

Для 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>