Удаленный сервер вернул неожиданный ответ: (400) Bad Request

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

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

Я могу нормально обработать 200 записей, но если я установлю, например, 250, он вернет ошибку 400. Я включил трассировку и т. д., но ничего не регистрируется, когда возникает ошибка. И клиент, и служба работают в одной среде (в целях тестирования) — Windows 2008r2. Я покажу оба файла конфигурации, а также то, как я вызываю службу.

Конфигурация клиента

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpRuntime  executionTimeout="180" maxRequestLength="2147483647" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_FinHqclient" closeTimeout="00:25:00"
          openTimeout="00:25:00" receiveTimeout="10:50:00" sendTimeout="00:25:00"
          maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
          useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />          
          <security>
            <transport realm="" />
          </security>
        </binding>
      </wsHttpBinding>
      <basicHttpBinding>
        <binding  maxBufferPoolSize="2147483647" name="test" maxBufferSize="2147483647"  maxReceivedMessageSize="2147483647" >
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="maxItemsInObjectGraphBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="2147483646" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://server:8123/service.svc" behaviorConfiguration="maxItemsInObjectGraphBehaviour"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_FinHqclient"    
        contract="sfgServ.FinHqclient" name="WSHttpBinding_FinHqclient">
        <identity>
          <servicePrincipalName value="host/local" />
        </identity>
      </endpoint>
    </client>    
  </system.serviceModel>
</configuration>

Это файл конфигурации сервера:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

  </configSections>
  <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>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />    
<httpRuntime  executionTimeout="180" maxRequestLength="2147483647" />
  </system.web>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true"  logMalformedMessages="true"
        logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <protocolMapping>
      <add scheme="http" binding="wsHttpBinding"/>
    </protocolMapping>
    <services>
      <service name="SFG.CRM2011.WebServiceFinHqFinHq.Service"  behaviorConfiguration="SFG.CRM2011.WebServiceFinHq.ServiceBehavior">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SFG.CRM2011.WebServiceFinHq.BindConfig"  
                  contract="sfgServ.IClientFinHQ" behaviorConfiguration="SFG.CRM2011.WebServiceFinHq.wsServiceEndpointBehavior">
        </endpoint>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" bindingConfiguration="higherMessageSize_MEX" address="mex" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="SFG.CRM2011.WebServiceFinHq.wsServiceEndpointBehavior">          
          <dataContractSerializer  maxItemsInObjectGraph="2147483646" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="SFG.CRM2011.WebServiceFinHq.ServiceBehavior">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
        <behavior >
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
          <!-- 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>    
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <wsHttpBinding >
        <binding name="SFG.CRM2011.WebServiceFinHq.BindConfig"    maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"  >
          <security mode="None">
            <transport clientCredentialType="None" />
            <message establishSecurityContext="false" />
          </security>
          <reliableSession enabled="true" ordered="True" inactivityTimeout="00:10:00" />
          <readerQuotas maxDepth="2147483647"
                         maxStringContentLength="2147483647"
                         maxArrayLength="2147483647"
                         maxBytesPerRead="2147483647"
                         maxNameTableCharCount="2147483647" />
        </binding>        
      </wsHttpBinding>
      <mexHttpBinding>
        <binding name="higherMessageSize_MEX"  />                  
      </mexHttpBinding>
        <basicHttpBinding >
        <binding  maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"  >
          <readerQuotas maxStringContentLength="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
   <security>
     <requestFiltering>
       <requestLimits maxAllowedContentLength="9000000" />
     </requestFiltering>
   </security>
 </system.webServer>
</configuration>

Ниже показано, как я вызываю эту службу в клиенте...

List<FUMStruct> fList = new List<FUMStruct>();

for (int i = 0; i < 250; i++)
{
    var t = new FUMStruct();
    t.clientID = "1234";
    t.ClientCRMGUID = new Guid("9EACA7AE-FE7E-E211-956A-00505622E202");
    t.CRMAccountCRMGUID = new Guid("A63D9ADC-0CFF-E211-94E9-00505622E202");
    t.Balance = 200 + i;
    fList.Add(t);
}
var serv = new FinHqclientClient();            
serv.UpdateLastFUMGUID(fList.ToArray());

person BruceAus    schedule 22.08.2013    source источник
comment
возможный дубликат сбой большого запроса веб-службы WCF с (400) Неверный HTTP-запрос   -  person Paul Keister    schedule 22.08.2013
comment
Нет, я видел эту статью ранее, и я пробовал там предложение (как видно из моих конфигурационных файлов), но безуспешно.   -  person BruceAus    schedule 23.08.2013
comment
Извини за это! Я, очевидно, не вдавался в подробности.   -  person Paul Keister    schedule 23.08.2013


Ответы (2)


Это произошло потому, что в привязке было значение «имя». Поэтому пользовательские значения, которые мы устанавливали, не применялись, и он загружал значения по умолчанию сервера (даже не уверен, где хранятся «значения по умолчанию» для различных привязок!) Я узнал об этом из статьи, которую я прочитал в Интернете, и создав новую служба, использующая только базовую привязку ... которая продолжала терпеть неудачу, пока я не удалил имя, после чего она начала работать! Затем мне пришлось выяснить, как это сделать для wsHttpBinding, потому что с этой привязкой, если вы не укажете имя (и тогда, очевидно, вы не можете сослаться на конфигурацию), вы получите всевозможные проблемы с безопасностью и т. д. и служба не работает ..поэтому решение состояло в том, чтобы добавить еще одну привязку без свойства name.

В конце концов, настройки были необходимы только на стороне сервера, потому что я оставил значения клиента по умолчанию (ниже, чем в приведенном выше примере), и это все еще работало. Ниже приведен полный файл web.config..обратите внимание, как мне пришлось по умолчанию использовать как basicHttpbinding, так и wsHttpbinding.

<bindings>
      <wsHttpBinding >
        <binding ***name="problemWithValue"***    maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"  >
          <security mode="None">
            <transport clientCredentialType="None" />
            <message establishSecurityContext="false" />
          </security>
          <reliableSession enabled="true" ordered="True" inactivityTimeout="00:10:00" />
          <readerQuotas maxDepth="2147483647"
                         maxStringContentLength="2147483647"
                         maxArrayLength="2147483647"
                         maxBytesPerRead="2147483647"
                         maxNameTableCharCount="2147483647" />
        </binding>
        <binding     maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"  >
          <security mode="None">
            <transport clientCredentialType="None" />
            <message establishSecurityContext="false" />
          </security>
          <reliableSession enabled="true" ordered="True" inactivityTimeout="00:10:00" />
          <readerQuotas maxDepth="2147483647"
                         maxStringContentLength="2147483647"
                         maxArrayLength="2147483647"
                         maxBytesPerRead="2147483647"
                         maxNameTableCharCount="2147483647" />
        </binding>
      </wsHttpBinding>
      <mexHttpBinding>
        <binding name="higherMessageSize_MEX"  />                  
      </mexHttpBinding>
        <basicHttpBinding >
        <binding  maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"  >
          <readerQuotas maxStringContentLength="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
person BruceAus    schedule 03.09.2013

Я заметил, что вы увеличили maxRequestLength для своего клиента, но не для своего сервера:

  <system.web>
    <!-- ... -->
    <httpRuntime  executionTimeout="180" maxRequestLength="2147483647" />
  </system.web>

Этот параметр конфигурации действительно актуален только для сервера, поскольку он устанавливает допустимый размер входящих запросов. В любом случае, я бы добавил эту часть в файл конфигурации вашего сервера и посмотрел, решит ли это проблему. Размер запроса по умолчанию составляет 4 МБ, и я знаю по опыту, что это может вызвать ошибку, о которой вы сообщаете.

person Paul Keister    schedule 23.08.2013
comment
Спасибо, попробовал, но пока безрезультатно. Все еще получаю то же сообщение об ошибке. Так странно! - person BruceAus; 23.08.2013