web-dev-qa-db-ja.com

(400)HTTP Bad Requestで失敗する大規模なWCF Webサービスリクエスト

この一見よくある問題に遭遇しましたが、解決できませんでした。

配列パラメーターの項目数が比較的少ない(50までテストした)WCF Webサービスを呼び出すと、すべて問題ありません。

ただし、500項目でWebサービスを呼び出すと、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.

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>

サーバー側では、私のweb.configファイルには次の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>

見た a かなり大きい of 回答 to この質問 with 成功なし

誰でもこれで私を助けることができますか?

74
Damovisa

サーバーでもmaxReceivedMessageSizeを設定してみてください。 4MBまで:

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

デフォルト(私が信じる65535)が非常に低い主な理由は、サービス拒否(DoS)攻撃のリスクを減らすためです。サーバー上の最大要求サイズとクライアント上の最大応答サイズよりも大きく設定する必要があります。イントラネット環境にいる場合、DoS攻撃のリスクはおそらく低いため、おそらく必要以上に高い値を使用しても安全です。

ところで、WCFサービスへの接続の問題をトラブルシューティングするためのいくつかのヒント:

  • このMSDN記事 の説明に従って、サーバーでトレースを有効にします。

  • クライアントで Fiddler などのHTTPデバッグツールを使用して、HTTPトラフィックを検査します。

107
Joe

私もこの問題を抱えていましたが、長い時間をかけて掘り下げた後にカスタムバインディング(BinaryXML用)を使用していたため、上記のいずれもうまくいきませんでした:-

SilverlightからWCFへの大きなXMLの送信

CustomBindingを使用しているため、web.configのbinding要素の下のhttpTransport要素でmaxReceivedMessageSizeを設定する必要があります。

<httpsTransport maxReceivedMessageSize="4194304" /> 
7
Mark Davies

価値がありますが、.NET 4.0を使用する際の追加の考慮事項は、有効なエンドポイントが構成に見つからない場合、デフォルトのエンドポイントが自動的に作成されて使用されることです。

デフォルトのエンドポイントはすべてのデフォルト値を使用するため、maxReceivedMessageSizeなどの値が大きい有効なサービス構成があると考えても、構成に問題がある場合は、デフォルトのエンドポイントが作成および使用。

これは静かに行われるため、検出は困難です。サーバーでトレースをオンにしているが、他の兆候がない場合(私の知る限り)、この効果に対するメッセージ(「サービスのエンドポイントが見つかりません、デフォルトエンドポイントを作成しています」など)が表示されます。

7
user469104

Web.configの.NET 4.0のサーバーでは、デフォルトのバインディングも変更する必要があります。以下の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>
5
RaSor

元のエラーの詳細については、WCFログを有効にすることもできます。これはこの問題を解決するのに役立ちました。

以下をweb.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>
4
Aaron Hoffman

クライアントをデバッグし、Tools\Options\Debugging\General\'Enable Just Code'をオフにし、Manage CLR例外のDebug\Exceptions\'catch all first-chance exceptions'をクリックして、プロトコル例外の前およびメッセージがワイヤに到達する前のクライアントの内部の例外。 (私の推測では、何らかのシリアル化の失敗でしょう。)

4
Brian

指摘したいだけです

MaxRecivedMessageSizeの他に、ReaderQuotasの下にも属性があり、サイズ制限ではなくアイテム数制限に達する可能性があります。 MSDNリンクは こちら

3
Yuan

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 ">

3
singh

私の場合、すべてのソリューションを試し、すべての制限を最大に設定しても機能しませんでした。最後に、Microsoft IIS=フィルタリングモジュール RLスキャン3.1 がコンテンツサイズに基づいて着信要求を拒否する独自の制限があるIIS/Webサイトにインストールされていることがわかりました「404 Not found page」を返します。

MaxAllowedContentLengthを必要な値に設定することにより、%windir%\System32\inetsrv\urlscan\UrlScan.iniファイルで制限を更新できます。

例えば以下は最大300 MBのリクエストを許可します

MaxAllowedContentLength = 314572800

それが誰かを助けることを願っています!

1
Sukhdeep Singh