ASP.NET MVCのActionメソッドでのJSONデータの制限

ASP.NET MVCはリクエストの内容(JSONデータも)をActionメソッドの引数にマッピングしてくれるので便利です。
以前、いろいろ使用している中でJSONデータの制限に引っかかったことがあったのでその内容を紹介します。

基本的な処理

TestコントローラーのIndexアクションにアクセスする場合、
hrefでリクエスト
(上記の記述についてはこちらの記事も参考になります)
ajaxでリクエスト
といった感じにして、
サーバー側で以下のように受けるようにしておきます。
// リクエストを受け取るクラス
TestIndexModel
// コントローラ/アクション
TestのIndexアクション
リクエストされるJSONの形式に合わせて受けるクラスを作成しておけば
他階層や配列になっていても大丈夫です。
JSONデータの制限
上記を利用して
Web画面上でtableに列を動的に追加して、それをリストでサーバーにJSONで送信するなんてことをしていると以下のエラーが発生しました。
  • 「JSON リクエストが大きすぎるため、逆シリアル化できませんでした。」
要はクライアントからの要求に含まれるJSONが大きすぎて復元できないといわれたわけですが、その時のリクエストヘッダでデータサイズをみると
  • Content-Length:29414
という内容で、そんなにサイズも大きくありませんでした。
調べてみると、データのサイズではなくペイロードの制限(JSONのkeyとvalueのペア数による制限)であることがわかりました。
デフォルトではこの制限が1000に設定されています(JSONデータ内のKeyとValueのセットが1000以内でなければならない)。
例えば、次のようにObjectを配列にしてリクエストする場合
配列を含むリクエスト
データサイズは大きくなくても要素数300の配列とかになるとペア数は1000を超えるので今回の制限に引っかかります。
この制限設定数は、Web.configにてMaxJsonDeserializerMembersを設定することで変更可能です。
WebConfigへの設定
もし同じようなことをしてみる場合は
自分の要件によって適切な値に設定してみてください。
※上記の制限とは別にサイズによる制限もあります。
サイズ自体が小さくできないのであればController/Actionではなくweb サービス(.asmx)などで作成することを検討しましょう。

ネクストスケープ企業サイトへ

NEXTSCAPE

検索する

タグ

メタデータ

投稿のRSS