WCF-как увеличить квоту размера сообщения
У меня есть служба WCF, которая возвращает клиенту 1000 записей из базы данных. У меня есть ASP.NET клиент WCF (я добавил ссылку на службу в asp.net проект веб-приложения для использования WCF).
Я получаю следующее сообщение при запуске клиентского приложения:
максимальная квота размера сообщения для входящих сообщений (65536 превышено. Чтобы увеличить квоту, используйте свойство maxreceivedmessagesize на соответствующая привязка элемент.
помочь? Как увеличить квоту размера сообщения?
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 настройка.
чтобы исправить проблему:
- щелкните правой кнопкой мыши на Конфигурационный Файл узел в нижней части дерева
- выберите Редактировать с помощью 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>