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ファイルに設定してあげることで解決!