- PR -

[ASP.NET]DataGridより大量データCSV出力でエラーが…

1
投稿者投稿内容
キミドリ
会議室デビュー日: 2006/07/27
投稿数: 3
投稿日時: 2006-07-27 21:55
はじめまして。
ASP.NETにて下記動作のWebアプリケーションを開発中です。

1.DB検索結果をDataTable "A" にセット。
2.DataGridにDataSourceを "A" としてバインドし、検索結果を一覧表示。
(ページング未使用)
3.同画面上にあるボタン "CSVOUT" を押すとDataGridの内容を
CSV形式に編集しダウンロード。

この時、DataGridに表示されているデータ件数が多いと
"CSVOUT"を押してもCSVOUT_Clickイベントが発生せずに
『ページが表示できません。』画面が表示されてしまいます。
※ 2000件程度のデータ件数で発生しています。
※ CSVOUT_Clickイベント発生直後にブレークポイントを作成しても
そこまで処理が進まず『ページが表示できません。』画面が表示されます。

DataGridの表示データ件数が少なければ正常に動作します。

これは何が原因なのでしょうか?
解決方法を是非ご教授願います。宜しくお願い致します。

がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-07-28 02:57
もう少しどのような状況なのか情報が無いとなんとも言えないのですが、
とりあえず、ボタンを押した後にサーバへリクエストが行ってるか
調べてみてはどうでしょうか?

リクエスト内の特定のフィールド(ViewSteteなど)が大きくなって、
ファイアウォールなんかに拒否される場合もあるみたいです。
キミドリ
会議室デビュー日: 2006/07/27
投稿数: 3
投稿日時: 2006-07-28 12:21
お返事ありがとうございます。

『サーバへリクエストが行われているか』を調べる方法が
わからないのですが、まずはIISのログを確認してみました。

ボタンを押すと
… POST /abc.aspx 400
とログが追記されましたので、
サーバに対してリクエストは届いていると思います。
ただし、エラーコード"400"は"不正なリクエスト"を意味だそうです。

Webアプリケーション実行時にページのソースを表示しテキストファイル
として保存したところ、その容量は約6MBになりました。
ご指摘の通り、そのうちViewStateが5MBもありました。

試しにDataGridのViewStateをFalseに設定し再実行したところ
『ページが表示できません。』画面は表示されなくなりました。
(データがない為に後続処理のCSVファイル作成では空のCSVが作成されます)

原因はViewStateにありそうですが、
その内容に問題があるのか、容量に問題があるのかを特定しなければなりません。
また、開発PCにてデバッグ実行でも『ページが表示できません。』となるので
ファイアウォールは今回は原因ではないと考えましたが間違いでしょうか?

ViewStateについて何か制限やルールがあるのでしょうか?
解決方法や調査のアイディア等、ご教授宜しくお願い致します。
がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-07-28 14:12
Web.config等をいじってない場合、ASP.NETはリクエストのサイズが4MB以上だと
リクエストを拒否するようになっているはずです。
/configuration/system.web/httpRuntime要素のmaxRequestLength値を変更すれば
リクエストを受け付けることはできます。

ただ、5MBのデータを送信するとなるとファイアウォール、プロキシ(リバース)、
IDSなどに引っかかる可能性があります。
そもそも5MBのデータをサーバに送信すること自体かなり辛いし、ViewState自体は
XMLだったはずなので、5MBのXMLを処理するのは結構負荷がかかりそうですね…

ViewStateの情報を使わずに、CSVOUTボタンが押されたらもう一度DBに検索しにいって
そこからCSVを構築したりするしかないでしょうね…
情報のリアルタイム性があまり重要でない(例えば、1日前の情報でもいい)のなら、
CSV自体は定時バッチで作成するって手もありますね。
キミドリ
会議室デビュー日: 2006/07/27
投稿数: 3
投稿日時: 2006-07-28 21:22
お返事ありがとうございます。

正常動作を確認しました。

ご教授頂いた通り『リクエストサイズの上限を増やす』為に
下記1行をWeb.configに追加しました。

<httpRuntime maxRequestLength="8000" />

今まで『ページが表示できません。』画面が表示されてしまっていた
データ量のDataGridからのCSVファイル作成が出来るようになりました。
問題解決もそうですが、
リクエストサイズに上限が存在する事、その値の増減が出来る事を
知識として得られた事が大きな収穫でした。
本当にありがとうございました。

ただ、ご指摘にもありましたが大容量データをサーバに送信する事は
トラフィックやレスポンス、サーバ負荷の観点から考えて
よくないなとも思いました。
今後の課題にしようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)