.net - WCF-Как увеличить размер сообщения
asp.net .net-3.5 (9)
У меня есть служба WCF, которая возвращает 1000 записей из базы данных клиенту. У меня есть ASP.NET-клиент WCF (я добавил ссылку на службу в проекте веб-приложения asp.net, чтобы потреблять WCF).
При запуске клиентского приложения появляется следующее сообщение:
Превышена максимальная квота размера сообщений для входящих сообщений (65536). Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize в соответствующем связывающем элементе.
Любая помощь? Как увеличить квоту размера сообщения?
Вам нужно что-то подобное увеличить квоты размера сообщения в файле 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 КБ потребовал бы очень большого количества клиентов, чтобы в большинстве случаев превосходить большинство серверов.
Для 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>
Если вы все еще получаете это сообщение об ошибке при использовании тестового клиента WCF, это связано с тем, что у клиента есть отдельный параметр MaxBufferSize .
Чтобы исправить проблему:
- Щелкните правой кнопкой мыши узел Config File в нижней части дерева.
- Выберите «Редактировать» с помощью 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;
У тестового клиента WCF есть своя конфигурация клиента.
Запустите тестовый клиент и прокрутите вниз. Если вы дважды щелкните узел «Файл конфигурации», вы увидите представление XML. Как вы видите, maxReceivedMessageSize
- 65536
.
Чтобы изменить это, щелкните правой кнопкой SvcConfigEditor
узел дерева файлов Config и выберите «Редактировать с помощью SvcConfigEditor
. Когда редактор откроет расширение Bindings и дважды щелкните ссылку, которая была автоматически сгенерирована.
Здесь вы можете редактировать все свойства, включая maxReceivedMessageSize
. Когда вы закончите, нажмите « Файл» - «Сохранить» .
Наконец, когда вы вернетесь в окно тестового клиента WCF, нажмите « Сервис» - «Параметры» .
ПРИМЕЧАНИЕ . Снимите флажок Всегда восстанавливать конфигурацию при запуске служб .
Я нашел легкий способ
--- щелкните правой кнопкой мыши файл конфигурации webconfig или app и нажмите EDIT CONFIGURATION WCF и получите bingdigs ans select 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>
Я решил проблему на 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>
<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>