私は .NET 4.0 で WCF サービスを作成しました。これは、x64
IIS 7.5 を搭載した Windows 7 Ultimate システムでホストされています。サービス メソッドの 1 つに引数として「オブジェクト」があり、画像を含む byte[] を送信しようとしています。この画像のファイル サイズが約 48 KB 未満であれば、すべてうまくいきます。しかし、より大きな画像をアップロードしようとすると、WCF サービスからエラーが返されます。(413) Request Entity Too Large.
もちろん、私は 3 時間かけてエラー メッセージを Google で検索しましたが、この件に関して私が見たすべてのトピックでは、「uploadReadAheadSize」プロパティを増やすことを提案しています。そこで、次のコマンドを使用しました (10485760 = 10 MB)。
"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"
"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"
また、IIS マネージャーを使用して、サイトを開いて [管理] の [構成エディター] に移動し、値を設定しました。残念ながら、依然として [要求エンティティが大きすぎます] エラーが発生しており、非常にイライラしています。
それで、このエラーを修正するために他に何を試すことができるか知っている人はいますか?
ベストアンサー1
これは IIS の問題ではなく、WCF の問題です。WCF は、大きなメッセージによるサービス拒否攻撃を回避するために、デフォルトでメッセージを 65 KB に制限します。また、MTOM を使用しない場合は、byte[] を base64 でエンコードされた文字列に送信します (サイズが 33% 増加) => 48 KB * 1,33 = 64 KB
この問題を解決するには、より大きなメッセージを受け入れるようにサービスを再構成する必要があります。この問題により、以前は 400 Bad Request エラーが発生していましたが、新しいバージョンの WCF では、このタイプのエラーの正しいステータス コードである 413 が使用されるようになりました。
maxReceivedMessageSize
バインディングで を設定する必要があります。 を設定する必要もありますreaderQuotas
。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding maxReceivedMessageSize="10485760">
<readerQuotas ... />
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>