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


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

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

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

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

13 420

13 ответов:

вы хотите, что-то вроде этого, чтобы увеличить размер сообщения квоты, в приложение.конфигурации или Web.конфигурации file:

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

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

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

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

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

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

Если вы создаете привязки 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;

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

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

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

вы можете редактировать все свойства здесь, в том числе maxReceivedMessageSize. Когда вы закончите нажмите кнопку File-Save.

наконец, когда вы вернетесь в окно тестового клиента WCF, нажмите Tools-Options.

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

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

--- щелкните правой кнопкой мыши файл конфигурации webconfig или app и нажмите кнопку изменить конфигурацию WCF и добрался до bingdigs ans выберите yore service и вправо боковое шоу maxReciveMessageSize дает большое количество - - -

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

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

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

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

Я установил в приложения.файл config (Эс. приложение myapp.конфигурации) этой конфигурации:

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

еще одна важная вещь, чтобы рассмотреть, из моего опыта..

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

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

более детально здесь:

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

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

Я получил эту ошибку при использовании этой настройки на веб.конфигурации

System.ServiceModel.ServiceActivationException

Я устанавливаю такие настройки:

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

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

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