ASP.NET MVCはリクエストの内容(JSONデータも)をActionメソッドの引数にマッピングしてくれるので便利です。
以前、いろいろ使用している中でJSONデータの制限に引っかかったことがあったのでその内容を紹介します。
基本的な処理
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を設定することで変更可能です。
もし同じようなことをしてみる場合は
自分の要件によって適切な値に設定してみてください。
※上記の制限とは別にサイズによる制限もあります。
サイズ自体が小さくできないのであればController/Actionではなくweb サービス(.asmx)などで作成することを検討しましょう。