web-dev-qa-db-ja.com

maxReceivedMessageSizeで修正されない413:要求エンティティが大きすぎます

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>の下にある)でバインディングを編集すると、大きなリクエストでは機能しません。

26
TrueWill

答えは私を正面から見つめていた。

Svcutilによって生成された構成はクライアント用でした。サーバーで使用していました。

<client>で指定されたエンドポイントのバインディングを編集していましたが、サービスにまったく違いはありませんでした。

適切な<service>エンドポイントを追加し、そのバインディングにmaxReceivedMessageSizeとmaxBufferSizeを設定すると、問題が解決しました。

25
TrueWill

同様の問題がありました。私にとっての問題は、エンドポイントが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>
24
matt burns

私もこの問題を抱えていましたが、フィドラーでは、動作していた最大のContent-Lengthが30000000になることに気付きました。

WCFの構成が正しいことを確認した後、IIS設定、要求のフィルタリング)の変更を提案する記事を見つけました。

WCFサービスを呼び出すWebアプリケーションの大きなファイルのアップロードの失敗– 413要求エンティティが大きすぎます

  1. Open IIS Manager
  2. アプリケーションを選択してください
  3. [リクエストフィルタリング]アイコンを選択します。
  4. [機能設定の編集...]を選択します(右パネル)
  5. 最大許容コンテンツ長(バイト)を調整しますデフォルトは30000000に表示されます

またはweb.configファイルの例

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="50000000" />
    </requestFiltering>
  </security>
</system.webServer>
2
mkdave99

10種類のブログから試してみたところ、同僚が見つけました。 basicHttpBindingセクションに加えて、basicHttpBindingセクションを内部に追加する必要がありました。 wcfを呼び出すwebapiサービスがあります。 webapiメソッドは、wcfサービスメソッドを呼び出したときに、エンティティが大きすぎるエラーをキャッチしていました。この変更は、wcfサービスのweb.configファイルで適用されました。

1
dmurphy

これを追加して解決してください:

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_Example"
 maxBufferSize="2147483647" 
maxReceivedMessageSize="2147483647">
            </binding>
        </basicHttpBinding>
    </bindings>
0
Zvi Redler