この一見よくある問題に遭遇しましたが、解決できませんでした。
配列パラメーターの項目数が比較的少ない(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 成功なし 。
誰でもこれで私を助けることができますか?
サーバーでもmaxReceivedMessageSizeを設定してみてください。 4MBまで:
<binding name="MyService.MyServiceBinding"
maxReceivedMessageSize="4194304">
デフォルト(私が信じる65535)が非常に低い主な理由は、サービス拒否(DoS)攻撃のリスクを減らすためです。サーバー上の最大要求サイズとクライアント上の最大応答サイズよりも大きく設定する必要があります。イントラネット環境にいる場合、DoS攻撃のリスクはおそらく低いため、おそらく必要以上に高い値を使用しても安全です。
ところで、WCFサービスへの接続の問題をトラブルシューティングするためのいくつかのヒント:
私もこの問題を抱えていましたが、長い時間をかけて掘り下げた後にカスタムバインディング(BinaryXML用)を使用していたため、上記のいずれもうまくいきませんでした:-
CustomBindingを使用しているため、web.configのbinding要素の下のhttpTransport要素でmaxReceivedMessageSizeを設定する必要があります。
<httpsTransport maxReceivedMessageSize="4194304" />
価値がありますが、.NET 4.0を使用する際の追加の考慮事項は、有効なエンドポイントが構成に見つからない場合、デフォルトのエンドポイントが自動的に作成されて使用されることです。
デフォルトのエンドポイントはすべてのデフォルト値を使用するため、maxReceivedMessageSizeなどの値が大きい有効なサービス構成があると考えても、構成に問題がある場合は、デフォルトのエンドポイントが作成および使用。
これは静かに行われるため、検出は困難です。サーバーでトレースをオンにしているが、他の兆候がない場合(私の知る限り)、この効果に対するメッセージ(「サービスのエンドポイントが見つかりません、デフォルトエンドポイントを作成しています」など)が表示されます。
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>
元のエラーの詳細については、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>
クライアントをデバッグし、Tools\Options\Debugging\General\'Enable Just Code'をオフにし、Manage CLR例外のDebug\Exceptions\'catch all first-chance exceptions'をクリックして、プロトコル例外の前およびメッセージがワイヤに到達する前のクライアントの内部の例外。 (私の推測では、何らかのシリアル化の失敗でしょう。)
指摘したいだけです
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=フィルタリングモジュール RLスキャン3.1 がコンテンツサイズに基づいて着信要求を拒否する独自の制限があるIIS/Webサイトにインストールされていることがわかりました「404 Not found page」を返します。
MaxAllowedContentLength
を必要な値に設定することにより、%windir%\System32\inetsrv\urlscan\UrlScan.ini
ファイルで制限を更新できます。
例えば以下は最大300 MBのリクエストを許可します
MaxAllowedContentLength = 314572800
それが誰かを助けることを願っています!