NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

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

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

 

基本的な処理

TestコントローラーのIndexアクションにアクセスする場合、

f:id:nextscape_blog:20210909114525j:plain

 (上記の記述についてはこちらの記事も参考になります)

f:id:nextscape_blog:20210909114550j:plain

といった感じにして、
サーバー側で以下のように受けるようにしておきます。
// リクエストを受け取るクラス

f:id:nextscape_blog:20210909114614j:plain

// コントローラ/アクション

f:id:nextscape_blog:20210909114641j:plain

リクエストされるJSONの形式に合わせて受けるクラスを作成しておけば
他階層や配列になっていても大丈夫です。
JSONデータの制限
上記を利用して
Web画面上でtableに列を動的に追加して、それをリストでサーバーにJSONで送信するなんてことをしていると以下のエラーが発生しました。
  • 「JSON リクエストが大きすぎるため、逆シリアル化できませんでした。」
要はクライアントからの要求に含まれるJSONが大きすぎて復元できないといわれたわけですが、その時のリクエストヘッダでデータサイズをみると
  • Content-Length:29414
という内容で、そんなにサイズも大きくありませんでした。
調べてみると、データのサイズではなくペイロードの制限(JSONのkeyとvalueのペア数による制限)であることがわかりました。
デフォルトではこの制限が1000に設定されています(JSONデータ内のKeyとValueのセットが1000以内でなければならない)。
例えば、次のようにObjectを配列にしてリクエストする場合

f:id:nextscape_blog:20210909114715j:plain

データサイズは大きくなくても要素数300の配列とかになるとペア数は1000を超えるので今回の制限に引っかかります。
この制限設定数は、Web.configにてMaxJsonDeserializerMembersを設定することで変更可能です。

f:id:nextscape_blog:20210909114738j:plain

もし同じようなことをしてみる場合は
自分の要件によって適切な値に設定してみてください。
※上記の制限とは別にサイズによる制限もあります。
サイズ自体が小さくできないのであればController/Actionではなくweb サービス(.asmx)などで作成することを検討しましょう。