.NET TIPS

[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2008/05/29

 「TIPS:[ASP.NET]独自のエラー・ページを設定するには?」では、通常のポストバックで発生した例外の処理方法について解説した。これを念頭に置いて、本稿では非同期ポストバック(UpdatePanelコントロール)による処理で例外が発生した場合のASP.NET AJAXのデフォルトの動作と、その動作を変更する方法について紹介する。本稿では、カスタム・エラー・ページの設定方法については割愛するので、これについての詳細は前掲のTIPSを参照していただきたい。

●カスタム・エラー・ページが設定されていない場合

 例外発生時の挙動を確認するために、まずは、次のようなページ(CustomError.aspx)を用意しておこう。

CustomError.aspxのフォーム・レイアウト
以下の各コントロールを配置する。
コントロール(ID) プロパティ 設定値
ScriptManager(manager)
UpdatePanel(upanel)
Button(btnUpdate) Text 更新

 さらに、Buttonコントロール(btnUpdate)のClickイベント・ハンドラを次のように記述する。

protected void btnUpdate_Click(Object sender, System.EventArgs e) {
  throw new Exception("非同期通信エラーが発生しました。");
}
Protected Sub btnUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  Throw New Exception("非同期通信エラーが発生しました。")
End Sub
[更新]ボタン・クリック時に例外を発生するコード(上:CustomError.aspx.cs、下:CustomError.aspx.vb)

 このコードでは、UpdatePanelコントロール内の[更新]ボタンをクリックしたタイミングで無条件に例外が発生するようにしている。まずはこのページを、カスタム・エラー・ページを設定していない状態で実行してみるとどうなるだろうか。

[注意]サンプル実行時の注意

Visual Studio上から本サンプルをデバッグ実行してしまうと、例外発生時にデバッグ中断されてしまい、意図した挙動を確認できなくなるので注意すること。本サンプルを起動するには、[デバッグ]−[デバッグなしで開始]を実行する必要がある。


カスタム・エラー・ページ未設定の場合(CustomError.aspxの実行結果)

 このように、例外メッセージがダイアログ表示されることが確認できるはずだ。

●カスタム・エラー・ページが設定されている場合

 では、次にカスタム・エラー・ページが有効な状態で、CustomError.aspxを実行してみるとどうだろう。今度は、カスタム・エラー・ページにリダイレクトされる――これがASP.NET AJAXのデフォルトの挙動である。

例外発生時にカスタム・エラー・ページにリダイレクト

 もっとも、非同期通信での例外でカスタム・エラー・ページにリダイレクトする必要があるかどうかは、その時どきの状況によって異なるかもしれない。というのも、通常の同期通信とは異なり、非同期通信は(例えば)自動的なデータの更新や入力支援など、補助的な用途で用いられることも多い。このようなケースで毎回エラー・ページにリダイレクトしてしまうと、エンド・ユーザーの作業はそこで中断されることになり、かえってアプリケーションの使い勝手を悪化させてしまうことにもなりかねない。後続の操作を続けるうえで差し支えのない例外であるならば、リダイレクトの発生はできるだけ抑えたいところだ。

 そこで登場するのが、ScriptManagerコントロールのAllowCustomErrorRedirectプロパティなのである。このプロパティをFalse(デフォルトはTrue)に設定することで、非同期通信で発生した例外によるリダイレクトを無効にすることができる。

リダイレクトを無効にした場合(例外メッセージをダイアログ表示)

 果たして、AllowCustomErrorRedirectプロパティをFalseに設定した状態で、CustomError.aspxを実行してみると、今度はエラー・ページにリダイレクトされず、上の画面のようなエラー・ダイアログだけが表示されるのを確認できる*1

*1 もっとも、エラー・ダイアログ表示すら煩わしいという局面では、Sys.WebForms.PageRequestManagerオブジェクトを利用することで、独自の例外処理を定義することも可能だ。具体的な方法については、「PageRequestManagerクラスでUpdatePanelコントロールを極める!」もご参照いただきたい。

●エラー・ダイアログの表示メッセージをカスタマイズする

 しかしながら、デフォルトで生成される例外メッセージは、多くの場合が開発者向けの内容であり、エンド・ユーザーにとっては意味がない(理解できない)ものであることがほとんどだ。また、メッセージの内容によってはアプリケーションの内部的な処理を漏えいする原因となることもあり、セキュリティ上の理由からも、これをそのまま表示することは好ましくない。

 そこでAllowCustomErrorRedirectプロパティをFalseに設定した場合には、通常、エンド・ユーザーに対して表示すべき、一般的なエラー・メッセージを用意しておくべきだろう。エラー・メッセージを設定するには、AsyncPostBackErrorMessageプロパティを指定すればよい。以下は、AsyncPostBackErrorMessageプロパティに「エラーが発生しています。非同期通信サービスが一時的に利用できません」と設定した場合の結果である。

AllowCustomErrorRedirectプロパティがFalse、かつ、AsyncPostBackErrorMessageプロパティにエラー・メッセージを設定した場合のエラー・ダイアログの表示

●非同期通信のタイムアウト時間を設定する

 アプリケーションで発生する例外を処理するほか、ASP.NET AJAX(ScriptManagerコントロール)では非同期通信が一定時間内で完了しない場合にタイムアウトさせることも可能だ。タイムアウト時間を設定するには、AsyncPostBackTimeoutプロパティに秒単位で設定すればよい。ここでは、以下のようなコードを追記したうえで、AsyncPostBackTimeoutプロパティを2(秒)に設定してみよう。

 そして、タイムアウト・エラーを意図的に発生させるために、ButtonコントロールのClickイベント・ハンドラに次の太字のコードを記述する。

protected void btnUpdate_Click(Object sender, System.EventArgs e) {
  System.Threading.Thread.Sleep(5000);  // 5000ミリ秒処理を休止
}
Protected Sub btnUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  System.Threading.Thread.Sleep(5000)  ' 5000ミリ秒処理を休止
End Sub
意図的にタイムアウト・エラーを発生させるコード(CustomError.aspx:上:C#、下:VB)

 この状態でコードを実行してみると、以下のようなエラー・ダイアログが表示され、確かに処理がタイムアウトしていることが確認できる。

非同期ポストバックでタイムアウトが発生した場合

 ちなみに、タイムアウトが発生した場合は、AllowCustomErrorRedirectプロパティの設定にかかわらず、エラー・ページにはリダイレクトしない。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET AJAX
関連TIPS:[ASP.NET]独自のエラー・ページを設定するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]非同期通信時に発生した例外情報をロギングするには?
[ASP.NET MVC]例外フィルタをカスタマイズするには?
適切に処理されなかった例外をキャッチするには?
WPF:例外をまとめてトラップするには?[C#/VB]
[ASP.NET AJAX]UpdatePanelコントロール利用時の注意点とは?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間