Большая ошибка запроса веб-службы WCF С (400) http Bad Request


я столкнулся с этой, по-видимому, общей проблемой и не смог ее решить.

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

однако, если я вызываю веб-службу с 500 элементами, я получаю ошибку Bad Request.

интересно, я работать Wireshark на сервере, и кажется, что запрос не даже попав на сервер - ошибка 400 генерируется на стороне клиента.

исключение:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.

The system.serviceModel раздел моего файла конфигурации клиента:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        establishSecurityContext="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://serviceserver/MyService.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService"
            contract="SmsSendingService.IMyService" name="WSHttpBinding_IMyService" />
    </client>
</system.serviceModel>

на стороне сервера, веб.конфигурационный файл имеет следующее :

<system.serviceModel>
    <services>
        <service name="MyService.MyService" behaviorConfiguration="MyService.MyServiceBehaviour" >
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyService.MyServiceBinding" contract="MyService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="MyService.MyServiceBinding">
          <security mode="None"></security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyService.MyServiceBehaviour">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Я посмотрел на довольно большие на ответы до этот вопрос С успеха.

может кто-нибудь помочь мне с этим?

9 74

9 ответов:

попробуйте установить maxReceivedMessageSize на сервере тоже, например, до 4 МБ:

    <binding name="MyService.MyServiceBinding" 
           maxReceivedMessageSize="4194304">

основная причина по умолчанию (65535 я считаю) настолько низка, чтобы уменьшить риск отказа в обслуживании (DoS) атак. Вам нужно установить его больше, чем максимальный размер запроса на сервере и максимальный размер ответа на клиенте. Если вы находитесь в среде интрасети, риск DoS-атак, вероятно, низок, поэтому, вероятно, безопасно использовать значение намного выше, чем вы ожидаете необходимость.

кстати несколько советов по устранению неполадок при подключении к службам WCF:

  • включить трассировку на сервере, как описано в этой статье.

  • используйте средство отладки HTTP, например Саша на клиенте для проверки HTTP-трафика.

Я также получал эту проблему, однако ни один из вышеперечисленных не работал для меня, поскольку я использовал пользовательскую привязку (для BinaryXML) после долгого копания я нашел ответ здесь : -

отправка большого XML из Silverlight в WCF

поскольку я использую customBinding, maxReceivedMessageSize должен быть установлен на элементе httpTransport под элементом binding в интернете.config:

<httpsTransport maxReceivedMessageSize="4194304" /> 

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

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

Это делается тихо, так что трудно обнаружить. Вы увидите сообщения об этом (например, "нет конечной точки, найденной для службы, создание конечной точки по умолчанию" или аналогичной), если вы включите трассировку на сервере, но нет никаких других указаний (насколько мне известно).

на сервере в .NET 4.0 в web.конфигурацию также необходимо изменить в привязке по умолчанию. Установите следующие 3 Парма:

 < basicHttpBinding>  
   < !--http://www.intertech.com/Blog/post/NET-40-WCF-Default-Bindings.aspx  
    - Enable transfer of large strings with maxBufferSize, maxReceivedMessageSize and maxStringContentLength
    -->  
   < binding **maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"**>  
      < readerQuotas **maxStringContentLength="2147483647"**/>            
   < /binding>

Это может быть полезно для отладки клиента, выключите инструменты\опции\отладки\общие\'включить только мой код, последовательно выберите пункты debug\исключения\'поймать все исключения первого шанса' для управляемого исключения CLR, и посмотреть, если есть исключение-под капота на клиенте перед протоколом исключением и прежде чем сообщение попадет на провода. (Я предполагаю, что это будет какой-то сбой сериализации.)

вы также можете включить ведение журнала WCF для получения дополнительных сведений об исходной ошибке. Это помогло мне решить эту проблему.

добавьте в свой веб-сайт следующее.config, он сохраняет журнал в C:\log\Traces.svclog

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel"
                  switchValue="Information, ActivityTracing"
                  propagateActivity="true">
            <listeners>
                <add name="traceListener"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "c:\log\Traces.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

просто хочу указать

помимо MaxRecivedMessageSize, есть также атрибуты под ReaderQuotas, вы можете нажать количество элементов ограничения вместо ограничения размера. Ссылка на MSDN здесь

Я нашел ответ на проблему Bad Request 400.

Это был параметр привязки сервера по умолчанию. Вам нужно будет добавить настройки по умолчанию для сервера и клиента.

имя привязки= ""openTimeout=" 00: 10: 00 "closeTimeout=" 00:10: 00" receiveTimeout= "00:10: 00" sendTimeout= "00:10: 00" maxReceivedMessageSize= "2147483647" maxBufferPoolSize= "2147483647" maxBufferSize="2147483647">

в моем случае он не работал даже после того, как попробовал все решения и установил все ограничения до макс. В последнем я узнал, что модуль фильтрации Microsoft IIS Url Scan 3.1 был установлен на IIS / веб-сайт, который имеет свой собственный предел для отклонения входящих запросов на основе размера контента и возврата "404 не найдена страница".

это предел может быть обновлен в установка MaxAllowedContentLength до требуемого значения.

например. следуя позволит до 300 МБ запросы

MaxAllowedContentLength=314572800

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