WCF Webサービスへの呼び出しがSystem.Net.WebException: The request failed with HTTP status 413: Request Entity Too Large.
で失敗します
Fiddlerを確認すると、送信していることがわかります。
コンテンツの長さ:149839
65KB以上です。
サーバーでWCFトレースを有効にすると、次のように表示されます。
System.ServiceModel.ProtocolException:受信メッセージの最大メッセージサイズクォータ(65536)を超えました。クォータを増やすには、適切なバインディング要素でMaxReceivedMessageSizeプロパティを使用します。
このプロパティを追加しても問題は解決しません。
私はちょうどそのプロパティで、そして(後で)投稿が示唆した他のさまざまなもので試しました。私が現在持っているものは次のとおりです(サーバー上):
<basicHttpBinding>
<binding name="PricerServiceSoap"
closeTimeout="00:10:00" openTimeout="00:10:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
私の唯一のエンドポイント(<client>
の下)は次のとおりです。
<endpoint address="/NetPricingService/Service.asmx"
binding="basicHttpBinding" bindingConfiguration="PricerServiceSoap"
contract="Pricing.PricerService.PricerServiceSoap"
name="PricerServiceSoap" />
私も追加しました:
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<behavior>
の下。
私も実行しました(IIS 7)の場合:
%windir%\system32\inetsrv\appcmd set config "WebServicesDev/PricingService"
-section:requestFiltering -requestLimits.maxAllowedContentLength:104857600
-commitpath:apphost
何も違いはありません。
キャッチは、これが古いASMXサービスを置き換えることを意図したWCFサービスであるということです。サービススケルトンは、既存のWSDLからsvcutilで生成されました。クライアント構成を変更できません言語)。私のテストクライアントプロジェクトは、Web参照の追加(Add Service Reference / Advanced
の下)でサービスをインポートしたため、WCF構成はありません。ただし、古いASMXサービスを指定すると、テストクライアントは機能します。
これを修正または診断するにはどうすればよいですか?
追加情報
Microsoftサービス構成エディターを使用して構成を生成する場合(maxReceivedMessageSizeとmaxBufferSizeを設定する)、機能します。問題は、エンドポイントが<service>
の下に指定され、/ NetPricingService/Service.asmx相対アドレスを指定できないことです。 svcutilで生成された構成(エンドポイントが<client>
の下にある)でバインディングを編集すると、大きなリクエストでは機能しません。
答えは私を正面から見つめていた。
Svcutilによって生成された構成はクライアント用でした。サーバーで使用していました。
<client>
で指定されたエンドポイントのバインディングを編集していましたが、サービスにまったく違いはありませんでした。
適切な<service>
エンドポイントを追加し、そのバインディングにmaxReceivedMessageSizeとmaxBufferSizeを設定すると、問題が解決しました。
同様の問題がありました。私にとっての問題は、エンドポイントがbindingConfiguration
を使用して明示的にバインディングに名前を付けなかったため、どこかでデフォルトのものを使用していたに違いないということでした。
私が持っていた:
<webHttpBinding>
<binding
name="myXmlHttpBinding"
maxReceivedMessageSize="10485760"
maxBufferSize="10485760">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
<security mode="None"/>
</binding>
</webHttpBinding>
私のエンドポイントは次のように定義されています:
<service
name="blah.SomeService">
<endpoint
address=""
behaviorConfiguration="WebHttpBehavior"
binding="webHttpBinding"
contract="blah.ISomeService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
エンドポイントを次のように変更すると機能しました:
<service name="blah.SomeService">
<endpoint address=""
behaviorConfiguration="WebHttpBehavior"
binding="webHttpBinding"
bindingConfiguration="myXmlHttpBinding"
contract="blah.ISomeService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
私もこの問題を抱えていましたが、フィドラーでは、動作していた最大のContent-Lengthが30000000になることに気付きました。
WCFの構成が正しいことを確認した後、IIS設定、要求のフィルタリング)の変更を提案する記事を見つけました。
WCFサービスを呼び出すWebアプリケーションの大きなファイルのアップロードの失敗– 413要求エンティティが大きすぎます
またはweb.configファイルの例
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="50000000" />
</requestFiltering>
</security>
</system.webServer>
10種類のブログから試してみたところ、同僚が見つけました。 basicHttpBindingセクションに加えて、basicHttpBindingセクションを内部に追加する必要がありました。 wcfを呼び出すwebapiサービスがあります。 webapiメソッドは、wcfサービスメソッドを呼び出したときに、エンティティが大きすぎるエラーをキャッチしていました。この変更は、wcfサービスのweb.configファイルで適用されました。
これを追加して解決してください:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Example"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
</binding>
</basicHttpBinding>
</bindings>