2009-05-19 2 views
402

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

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

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

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

+0

У меня была такая же проблема, но у меня была недружественная ошибка сети 400, но решение было размером с размеру сообщения. –

+2

Я решил проблему с помощью действий, указанных в [ссылка] [1] [1]: http://stackoverflow.com/questions/7476853/wcf-error-maximum-number- of-items-that-can-be-serialized-or-deserialized-in-an/8656402 # 8656402 – Ram

+0

Почему он установлен так низко по умолчанию? Безопасность? – Coops

ответ

525

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

+16

Thanks..This изменение должно быть сделано в файле web.config клиентского приложения. – bugBurger

+7

Возможно, вам также потребуется изменить его на сервере - если вам нужно отправить большой набор данных в качестве параметра в метод WCF. – Nate

+4

Любая конкретная причина для размера сообщения 20000000? –

129

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

Для устранения проблемы:

  1. Щелкните правой кнопкой мыши на Config File узла в нижней части дерева
  2. Выберите Edit с SvcConfigEditor

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

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

+7

Почему я всегда забываю об этом? +1 –

+6

На vs2013 SvcConfigEditor заменяет конфигурацию WCF, если люди ее ищут. – ZoomVirus

+0

Не удалось найти SVCconfigEditor? –

82

Если вы создаете ваш 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; 
+1

Где я могу использовать этот код ? – programmer138200

+0

Вы можете использовать его для инициализации. Ясно, что вы можете использовать его в своем методе конструктора. – aemre

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 м, которые я выбрал? – Nate

+3

Контекст тоже хорош ... возможно, эти два ответа могут быть объединены? – Jeff

+1

- это настройка на сервере или клиенте? –

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». –

39

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

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

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

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

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

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

+2

Наверное, лучший ответ здесь! – Haris

+3

upvote из-за примечания, чтобы снять флажок «Всегда восстанавливать конфигурацию». – furier

+0

Простейшее решение на мой взгляд. Успокоил мне головную боль. –

1

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

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> 

+3

Итак, вы исправили свою проблему, используя ответ Nate, а затем разместили ее как свою. Не круто. – arcain

+0

@arcain Ответ Nates был очень общим, с использованием имен акций и номеров, которые можно ожидать часто появляться. Этот ответ не был украден, это просто правильный ответ. Поскольку есть только один правильный ответ, он должен быть повторен. –

+0

@ kingfrito_5005 «Правильный ответ» уже был здесь, когда ответчик опубликовал это. Он довольно четко поднял элемент привязки Nate и переписал его как часть своего ответа. Значения '2000000' довольно разные. – arcain

6

я решил свою проблему на Bing Maps WPF на моем project Использование 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> 
2

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

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

14

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

--- правой кнопкой мыши WebConfig или приложение конфигурационный файл и нажмите EDIT WCF КОНФИГУРАЦИИ и получил bingdigs анс выберите услугу былого и правый сторона шоу maxReciveMessageSize дают большое число - -

+2

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

2

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

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

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

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

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> 
Смежные вопросы