Ошибка 400 (неверный запрос): maxReceivedMessageSize не учитывается для моей службы WCF

There are multiple related questions on SO (almost same title), none of them helped me to fix my problem. Please do not close my question as duplicate before reading it. Thanks.

В настоящее время я использую WCF для предоставления веб-службы (SOAP, HTTP). В настоящее время он развернут в IIS Express. Моя проблема в том, что я не могу использовать мой сервис от моего клиента. Мой клиент получаетHTTP Error 400 Bad request исключение.

Затем я активировал трассировку на стороне сервера, чтобы увидеть, что на самом деле происходит, вот что я получаю:

enter image description here

Я перевел сообщение об ошибке на английский язык:The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element..

Довольно понятно, на самом деле. Поскольку мое сообщение SOAP довольно тяжелое, оно, вероятно, превышает ограничение в 64 КБ.

Я решил расширить этот предел в конфигурации привязки. Итак, вот мой web.config (на стороне сервера):

<code><services>
  <service name="MyServiceName">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration="MyBindingConfiguration"
              bindingNamespace="http://my_namespace"
              contract="XXX.IMyContract" />
  </service>
</services>

<bindings>
  <basicHttpBinding>
    <binding name="MyBindingConfiguration"
             allowCookies="true"
             maxReceivedMessageSize="2147483647"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>
</code>

Как видите, все размеры установлены наint.MaxValue.

Я также изменил свой клиентский app.config, вот он:

<code><bindings>
  <basicHttpBinding>
    <binding name="MyBindingName"
             allowCookies="false"
             bypassProxyOnLocal="false"
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             messageEncoding="Text"
             textEncoding="utf-8"
             transferMode="Buffered"
             useDefaultWebProxy="true">

      <readerQuotas maxDepth="32"
                    maxStringContentLength="2147483647"
                    maxArrayLength="16384"
                    maxBytesPerRead="4096"
                    maxNameTableCharCount="16384" />

      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>

    </binding>
  </basicHttpBinding>
</bindings>

<client>
  <endpoint address="http://localhost:8083/myAddress.svc"
            binding="basicHttpBinding"
            bindingConfiguration="MyBindingName"
            contract="IMyContract"
            name="MyBindingName" />
</client>
</code>

Затем я снова развернул свой сервис, и проблема все еще была здесь (HTTP 400, Bad request на стороне клиента +MaxReceivedMessageSize limited to 65536 на стороне сервера).

Затем я протестировал свой сервис с очень маленьким SOAP-сообщением:everything is perfectly fine, Так что проблема в том, что мое сообщение больше 64 КБ.

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

Я много гуглил об этой проблеме, 95% времени проблема заключается в том, что разработчик забыл указатьbindingConfiguration атрибут в конечной точке службы. Как вы можете видеть в моем web.config выше, для меня это нормально.

Затем я нашелеще один вопрос по stackoverflow о (почти) той же проблеме.

Как сказал автор в своем вопросе, установка имени конфигурации привязки вstring.Empty & Quot; затруднительные & Quot; эта проблема:

<code><services>
  <service name="MyServiceName">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration=""
...

<bindings>
  <basicHttpBinding>
    <binding name=""
...
</code>

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

Я воссоздаю вопрос здесь, потому что на самом деле это не те же условия: моя служба не размещена самостоятельно, а размещена в IIS Express (или IIS 7.5, протестировано, та же проблема).

Я нашелпохожая проблема здесь с самостоятельным обслуживанием, и проблема была связана с этой особенностью. Так что я думаю, что есть что-то другое между этими двумя SO вопросами.

Я думаю, что-то явно не так в моей конфигурации, но я не могу найти что. Любая помощь приветствуется.

 marc_s06 апр. 2012 г., 12:34
Что вы можете сделать в конфигурации вашего сервера (и клиента), это определитьno name для конфигурации привязки, например, иметь<bindings> <basicHttpBinding> <binding ......> безname="MyBinding" приписывать. В этом случае эта конфигурация привязки будет применена кall конечные точки, использующие эту привязку (если они не указывают конкретную конфигурацию привязки для использования).
 ken2k06 апр. 2012 г., 13:35
@marc_s Вы абсолютно правы: я забыл указать пространство имен для имени службы. Я только что проверил мой сервис с полным именем, теперь он работает как положено! Я бы никогда не нашел это в одиночестве. Почему, черт возьми, мой сервис прекрасно работал с небольшим SOAP-сообщением? Указание имени службы без пространства имен нарушает конфигурацию привязки, а не самой службы (она отлично работает даже для небольшого сообщения со случайным именем!). Это очень странное поведение ИМО. В любом случае, вы решили мою проблему, пожалуйста, напишите это как ответ, чтобы я мог принять это. Большое спасибо.
 marc_s06 апр. 2012 г., 12:31
На первый взгляд все выглядит хорошо - единственное, что<service name="....."> атрибутmust точно соответствует вашему полностью квалифицированному классу реализации сервиса (включая все пространства имен и т. д.) - так ли это? Я спрашиваю, потому что у вас естьcontract="XXX.IMyContract" указав пространство имен, но вашserviec name="...." Атрибут не имеет никакого пространства имен, намекаемого на ....

Ответы на вопрос(2)

Решение Вопроса

На первый взгляд все выглядит хорошо - единственное, что<service name="....."> атрибут должен совпадатьexactly к вашему полностью квалифицированному классу реализации сервиса (включая все пространства имен и т. д.) - так ли это?

Я спрашиваю, потому что у вас естьcontract="XXX.IMyContract" указав пространство имен, но ваш<service name="...."> Атрибут не имеет никакого пространства имен, на которое намекают.

 ken2k06 апр. 2012 г., 15:29
Это исправило мою проблему, спасибо. Как сказано в комментариях, "указание имени службы без пространства имен нарушает конфигурацию привязки, а не саму службу (она отлично работает даже для небольшого сообщения со случайным именем!)". Могу ли я спросить вас, есть ли у вас представление о том, почему служба ведет себя так?
 08 мая 2012 г., 20:08
marc_s, я хотел бы поблагодарить вас за подробное объяснение этого вопроса (это просто решило ту же проблему, что и у меня). Какая разочаровывающая «фича», эта глупость поведения по умолчанию.
 06 апр. 2012 г., 22:40
@ ken2k: я полагаю, что вы стали "жертвой" нового поведения WCF 4 по умолчанию. Если WCF 4 не может найти конфигурацию для службы (поскольку ее там нет или имя службы введено с ошибкой), он просто использует некоторые системные значения по умолчанию - например, HTTP в качестве протокола и привязку для HTTP. Скорее всего, это случилось с вами - среда выполнения WCF 4 ускорила работу вашего сервиса - но только с настройками по умолчанию, например, размер сообщения по умолчанию 64K - даже если у вас был конфиг.

Попробуйте следующие настройки веб-конфигурации в сервисе:

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
    <standardEndpoints>

            <webHttpEndpoint>
                <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"                                        
                                  crossDomainScriptAccessEnabled="true" 
                                  maxReceivedMessageSize="2147483647" 
                                  maxBufferSize="2147483647" 
                                  maxBufferPoolSize="4194304" />
            </webHttpEndpoint>

    </standardEndpoints>

    <bindings>
        <webHttpBinding>
            <binding>
                <readerQuotas maxStringContentLength="2147483647"/>
            </binding>
        </webHttpBinding>
    </bindings>

</system.serviceModel>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Ваш ответ на вопрос