Ошибка WCF - неожиданный ответ: (400) Неверный запрос - PullRequest
3 голосов
/ 15 ноября 2010

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

Чтобы немного больше рассказать о себе, я портирую веб-службу asmx на веб-службу WCF, размещенную в Windows Azure.Эта проблема возникла во время тестирования.Если я передаю небольшое количество транзакций своему веб-сервису за один вызов, он обычно работает нормально.Эта ошибка возникает, когда размер моей транзакции составляет около 50-60 (транзакции).Сериализованный в xml, размер файла составляет около 300 КБ, поэтому он не слишком большой.Но он склонен склоняться к проблеме размера.

Кроме того, при включении трассировки WCF я обнаружил следующее исключение:

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

в System.ServiceModel.Channels.HttpInput.ThrowHttpProtocolException (строковое сообщение, HttpStatusCode statusCode, String statusDescription)

в системе.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded ()

в System.ServiceModel.Channels.HttpInput.ReadBufferedMessage (Поток inputStream)

в System.ServiceModel.InceptionMap_Exception.ExceptionPhanceP.

в System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived (контекст HttpRequestContext, обратный вызов действия)

Таким образом, из этого исключения выглядит, как будто один из параметров отключен в моей сети.config, но вот как это выглядит:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    <behavior name="MetadataEnabled">
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="true"/>
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <add scheme="http" port="8081"/>
          <add scheme="https" port="444"/>
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>
      <dataContractSerializer maxItemsInObjectGraph="111024000"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service name="Bandicoot.Core" behaviorConfiguration="MetadataEnabled">
    <endpoint name="HttpEndpoint"
              address=""
              binding="wsHttpBinding"
              bindingConfiguration="wsHttp"
              contract="Bandicoot.CORE.IRepricer" />
    <endpoint name="HttpMetadata"
              address="contract"
              binding="mexHttpBinding"
              bindingConfiguration="mexBinding"
              contract="Bandicoot.CORE.Stack" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/Core"/>
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="wsHttp" maxReceivedMessageSize="111024000" 
             messageEncoding="Text" maxBufferPoolSize="111024000" 
             textEncoding="UTF-8">
      <readerQuotas maxBytesPerRead="111024000"
                    maxArrayLength="111024000"
                    maxStringContentLength="111024000"/>
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
  <mexHttpBinding>
    <binding name="mexBinding"/>
  </mexHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

У кого-нибудь есть какие-либо другие предложения или в моем файле web.config что-то не так, что я простоне видите?

Спасибо за любой совет!

Редактировать: Вот настройки из app моего клиента.config

<bindings>
<basicHttpBinding>
    <binding name="BasicHttpBinding_CORE" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="14194304" maxBufferPoolSize="14194304" maxReceivedMessageSize="14194304"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
        <readerQuotas maxDepth="1000" maxStringContentLength="111024000"
            maxArrayLength="111024000" maxBytesPerRead="1024000" maxNameTableCharCount="111024000" />
        <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
    </binding>
</basicHttpBinding>

Редактировать: добавить дополнительную информацию о клиенте:

        <client>
        <endpoint address="http://localhost:92/CORE.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_CORE" contract="Core.CORE"
            name="BasicHttpBinding_CORE" />
    </client>

Редактировать:Попытка изменить привязки службы к basicHttpBinding - изменения конфигурации:

      <basicHttpBinding>
    <binding name="basicHttp" maxReceivedMessageSize="111024000"
             messageEncoding="Text" maxBufferPoolSize="111024000"
             textEncoding="UTF-8">
      <readerQuotas maxArrayLength="111024000" maxBytesPerRead="111024000" maxStringContentLength="111024000"/>
      <security mode="None" />
    </binding>
  </basicHttpBinding>

      <service name="Bandicoot.Core" behaviorConfiguration="MetadataEnabled">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration="basicHttp"
              contract="Bandicoot.CORE.IRepricer" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              bindingConfiguration="mexBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/Core"/>
      </baseAddresses>
    </host>
  </service>

А также файл app.config клиента для справки:

        <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_CORE" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="100000000"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" 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:92/CORE.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_CORE" contract="Core.CORE"
            name="BasicHttpBinding_CORE" />
    </client>

Ответы [ 4 ]

2 голосов
/ 15 ноября 2010

Вам необходимо установить maxReceivedMessageSize на клиенте (куда приходит сообщение, которое вы возвращаете с вашего сервиса) - в app.config или web.config:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="wsHttp" maxReceivedMessageSize="111024000" 
             messageEncoding="Text" maxBufferPoolSize="111024000" 
             textEncoding="UTF-8">
      <readerQuotas maxBytesPerRead="111024000"
                    maxArrayLength="111024000"
                    maxStringContentLength="111024000"/>
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
  <mexHttpBinding>
    <binding name="mexBinding"/>
  </mexHttpBinding>
</bindings>
<client name="whatever">
    <endpoint name="HttpEndpoint"
        address=""
        binding="wsHttpBinding"
        bindingConfiguration="wsHttp"
        contract="Bandicoot.CORE.IRepricer" />
</client>
</system.serviceModel>

Значение по умолчанию для maxReceivedMessageSize составляет 64 КБ, если вы его не измените.

1 голос
/ 22 ноября 2010

У меня была та же ошибка, и причиной была также обнаружена ошибка конфигурации.

Но в моем случае, как и в случае с marc_s, это было значение maxReceivedMessageSize на на стороне сервера .Сервер все еще использовал свою конфигурацию по умолчанию, которая составляла всего 64 КБ.

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

Я надеюсь, что это может помочь кому-то еще.

1 голос
/ 17 ноября 2010

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

Я нашел эту ссылку полезной для понимания.

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

Потребовалось несколько дней, чтобы понять это, но это было воспитательно. Спасибо за предложения!

0 голосов
/ 20 декабря 2013

Плакат с приветом "Brosto"!

Это дополняет ваш ответ 17 ноября 2010 г. в 15:29.

Мы веселились или должныСегодня я говорю о «образовательной» проблеме тестирования развертывания производства, на решение которой ушла большая часть дня, и она была вызвана буквально одним нажатием клавиши.Мы только подтвердили источник проблемы после того, как обнаружили, что проблема исчезла после полного развертывания веб-фермы.

Вот причина.Когда мы тестируем наше производственное развертывание и делаем это для «Единого сервера» , изменяя наш файл hosts, мы обходим балансировщик нагрузки, и вызов к одиночному серверу заканчивается через http-порт по умолчанию 80 !Когда мы проводим тестирование на «Балансировщик нагрузки» , вызов одиночного сервера с балансировщика нагрузки завершается через определенный порт «Балансировщик нагрузки» 81 !

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

соединение с одним сервером:

endpoint address="http://www.myserver.com:80/Services/MyService.svc"

соединение с сервером с балансировкой нагрузки:

endpoint address="http://www.myserver.com:81/Services/MyService.svc"

Мой босс правильно диагностировал основную проблему на раннем этапе, сказав, что сервер работает так, как , пользовательские привязки игнорируются и вместо них используются значения по умолчанию. После показа ему вашего комментария выше, где вы упомянули требование о «полностью квалифицированном» адресе конечной точки службы , он понял, что перенаправление файла хоста приводило к тому, что запрос нашего браузера переходил на единый серверчерез порт 80 по умолчанию вместо порта 81 с балансировкой нагрузки, который фактически изменил полный адрес конечной точки службы, что заставило сервер игнорировать пользовательские привязки и вернуться к настройкам по умолчанию. Обратите внимание, что он НЕ вызывал службу, он только не смог связать пользовательские привязки!

Надеюсь, кто-то запомнит эту публикацию в следующий раз, когда мы производим тестирование службыс пользовательскими привязками:)

...