はじめに
前記事「【Oracle】クエリパラメータ(バインド変数)を使うとパフォーマンスが悪くなることもあるバインドピーク問題」で対応したことで一覧が出るようになり、対象のリストにチェックボックスを付けて送信ボタンをクリックしたところ、通信エラー「HTTP500内部サーバーエラー」となりランタイムエラーとなってしまった。
クライアント上だと正しいエラーが出ないことに気が付き、ホスト上で実行してみると「JSON リクエストが大きすぎるため、逆シリアル化できませんでした。(The JSON request was too large to be deserialized.)」エラーが出ていました。
調査
エラー名でネット検索「JSON リクエストが大きすぎるため、逆シリアル化できませんでした。」で下記サイトがヒット。
- ASP.NET MVCのActionメソッドでのJSONデータの制限
- ASP.NETでJSON形式のリクエストが「The JSON request was too large to be deserialized」というエラーになる場合の対処方法
原因
エラーメッセージからするとデータのサイズではなくペイロードの制限(JSONのkeyとvalueのペア数による制限)のようです。
Microsoft セキュリティ更新プログラム MS11-100 によってリクエストに含まれるキー数が最大 1000 に制限されているためです。おそらく多量のキーを含むリクエストを送るDoS攻撃への対策ではないかと思われます。
今回はPOSTしたJSONデータが多くなったことで、このエラーに引っ掛かってしまった。
対応
この上限は、Web.configのappSetting要素に以下の要素を追加することで指定することができます。
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="100000" />
</appSettings>
</configuration>
最後に
検索すれば情報が見つかるのにあえて書くか迷ったんですが、下記サイトの記事を読んで「ドッグフーディング」しようと書いてみました。
「あー、これ既にやったことあるなー。なんだっけ?」とググった先が自分のブログであってほしい、そんな思いで書いてみてください。
一番最初の利用者が自分、すなわちドッグフーディングしましょう。
初めての「技術ブログ」書き方のご紹介