Невозможно установить maxReceivedMessageSize через web.config - PullRequest
8 голосов
/ 17 сентября 2009

Я исследовал код 400 - BadRequest за последние два часа. Многие предположения направлены на то, чтобы убедиться, что атрибут bindingConfiguration установлен правильно, и в моем случае это так.

Теперь мне нужна ВАША помощь, прежде чем разрушить здание, в котором я нахожусь: -)

Я запускаю сервис WCF RestFull (очень легкий, использующий этот ресурс для вдохновения: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx), который (на данный момент) принимает XmlElement (POX), предоставляемый через глагол POST.

В настоящее время я использую только конструктор запросов Fiddler до реализации настоящего клиента (поскольку это смешанные среды).

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

Вот мой файл web.config (для которого я даже включил тег client (в отчаянные времена!)):

<system.web>
    <httpRuntime maxRequestLength="1500000" executionTimeout="180"/>
  </system.web>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxReceivedMessageSize="1500000" maxBufferPoolSize="1500000" maxBufferSize="1500000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="1500000" maxArrayLength="1500000" maxBytesPerRead="1500000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <client>
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Commerce.ICatalogue"/>
    </client>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Catalogue">
        <endpoint address="" 
                  behaviorConfiguration="RestFull" 
                  binding="webHttpBinding"
                  bindingConfiguration="WebHttpBinding" 
                  contract="Commerce.ICatalogue" />
        <!-- endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" / -->
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestFull">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Заранее благодарим за любую помощь, ведущую к успешному вызову с> 65K XML; -)

Ответы [ 4 ]

13 голосов
/ 18 сентября 2009

Хорошо, этот действительно вызвал у меня трудности с разрешением, за которые я пощадлю других. Проблема заключалась в том, что я использовал <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>, который является хорошим и простым подходом к реализации на заводе.

Однако у этого подхода есть свои недостатки; поскольку в файле web.config не требуется настройка, класс WebServiceHostFactory по своему дизайну никогда не считывает данные из файла web.config. Я знаю; Я мог бы унаследовать от этого класса и внести соответствующие изменения, чтобы он действительно мог читать из файла конфигурации, но это, казалось, немного выходило за рамки.

Моим решением было вернуться к более традиционному способу реализации WCF; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>, а затем используйте мои уже настроенные значения в файле web.config.

Вот мой измененный файл web.config (в отношении головной боли Maddox):

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="XmlMessageBinding" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="fullyQualifiedClassName" behaviorConfiguration="DevelopmentBehavior">
        <endpoint name="REST" address="" binding="webHttpBinding" contract="fullyQualifiedInterfaceName" behaviorConfiguration="RestEndpointBehavior" bindingConfiguration="XmlMessageBinding" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DevelopmentBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
        <behavior name="ProductionBehavior">
          <serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="false"/>
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Еще одно преимущество этого изменения заключается в том, что теперь вы можете ссылаться на свою службу WCF-отдыха непосредственно из .NET; это невозможно сделать с помощью модели Factory и моей реализации XmlElement с помощью решения.

Я надеюсь, что это может помочь другим с похожими проблемами ...

6 голосов
/ 04 октября 2012

Я думаю, что у меня была та же проблема, но когда я настроил привязку по умолчанию для webHttp, тогда она заработала:

<bindings>
        <webHttpBinding>
            <binding maxReceivedMessageSize="2000000"
                      maxBufferSize="2000000">
                <readerQuotas maxStringContentLength="2000000"/>
            </binding>
        </webHttpBinding>
    </bindings>

Замечание: на привязке нет имени.

6 голосов
/ 19 января 2012

Я знаю, что это очень старый вопрос, и на него уже есть ответ ...

В любом случае ...

Что я сделал, чтобы решить эту «проблему», я создал фабрику, унаследованную от WebServiceHostFactory, и создал узел пользовательских служб, унаследованный от WebServiceHost

И в хосте я переопределил метод OnOpening следующим образом

protected override void OnOpening()
        {
            base.OnOpening();

            foreach (var endpoint in Description.Endpoints)
            {
                var binding = endpoint.Binding as System.ServiceModel.Channels.CustomBinding;

                foreach (var element in binding.Elements)
                {
                    var httpElement = element as System.ServiceModel.Channels.HttpTransportBindingElement;
                    if (httpElement != null)
                    {
                        httpElement.MaxBufferSize = 2147483647;
                        httpElement.MaxReceivedMessageSize = 2147483647;
                    }
                }
            }

        }
0 голосов
/ 17 сентября 2009

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

WCF - Исправление исключений длины строки на стороне клиента

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

...