ASP.NETでハマったデータサイズ問題(クォータ編)
すごくハマった&検索しても大した情報が出てこなかったので、共有の為にメモしておきます。
概要
ASP.NET4.0において「javascriptからWCFサービスを直接呼び出してDBアクセスを行う」という実装を行っていたところ、WCFサービスを呼び出す際の引数にJSONデータをセットしていたのですが、引数にセットするJSONデータのサイズによってはエラーが返ってくることが判明。
エラー内容
"内部エラーのため、クライアントは要求を処理できませんでした。このエラーの詳細については、例外情報をクライアントに返信するためにサーバーで IncludeExceptionDetailInFaults を有効にするか (ServiceBehaviorAttribute または
構成動作を通じて)、Microsoft .NET Framework 3.0 SDK ドキュメントに従ってトレースを有効にして、サーバーのトレース ログを調べてください。"
ゴチャゴチャ書いていますが、要するにWCFサービスから詳細なエラーの内容が返ってきていないっぽいですね。
詳細なエラー内容をサービスから返してもらう
呼び出し先のWCFサービスクラスに以下を記述。
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
この記述により、さきほどより詳細なエラー内容が返ってきました。
"XML データの読み取り中に、最大文字列コンテンツ長のクォータ (8192) を超えました。このクォータを増やすには、XML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトの MaxStringContentLength プロパティを変更してください。"
どうやら受け渡しするJSONデータのサイズが最大文字数を超えていますね。
Web.Configファイルの設定
調査した結果、Web.Configファイル内にて「XmlDictionaryReaderQuotas オブジェクトの MaxStringContentLength プロパティ」を変更することができることがわかりました。
<bindings> <webHttpBinding> <binding name="webHttpBindingSettings" maxReceivedMessageSize="2147483647"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> </binding> </webHttpBinding> </bindings>
上記のように、ReaderQuotasオブジェクトが読み込める最大の文字数をWebConfigファイルに設定してあげることで解決!