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>