###前提・実現したいこと
ASP.NETで、セッション読み込み完了時に共通処理としてログインチェックを行いたいです。
グローバルアプリケーションクラス内のApplication_BeginRequestイベントで
処理を行ってみたのですが、以下のような例外が出ました。
このコンテキストでセッション状態は利用できません。
MSDNに掲載されているページのライフサイクルの概要等を参照した結果、
Application_BeginRequestイベントが発生する段階では
セッション情報が取得されていないらしいということが分かったのですが、
セッション取得完了直後に発生するイベントが分かるような記事が見つからずに困っています。
以下にソースコードを記述します。
###該当のソースコード
C#
1 2Global.asax.cs 3 4protected void Application_BeginRequest(object sender, EventArgs e) 5{ 6 // ログインIDがセッションから取得できず、ログインが必要なページなら 7 if (Session["USER_ID"] == null && Request.Url != ...) 8 { 9 // タイムアウト画面へ遷移する処理 10 ... 11 } 12}
###試したこと
ネット上の記事を参考にSession_Startイベントに処理を記述してみました。
リクエストのセッションが取得できなかった場合にはセッションが新しく作成されるため、
そこでこのイベントが起きるということだと思います。
(目的を満たせなかったため、詳しいことを調べてはいません。)
しかし、このイベントではタイムアウトしか検知することが出来ないため、
遷移後に戻るボタンを使用したりして再び元の画面で操作を行った場合はダメでした。
そもそもタイムアウトのハンドリングの記事だったと思うので、改めて考えると目的がずれていました。
###備考
同様の課題についてマスターページのInitイベントに処理を記述する手法で解決した前例を
ネット上で発見し、少なくとも目的は満たせそうなため、一度はそれで満足しかけたのですが、
その方法だとコンテンツページのInitイベントで行いたい処理がある場合には機能しないため、
本質的な解決にはならないのではないかと考え直しました。
熟考の末、論理的な側面から考えても、ログインチェックを行いたいタイミングは、
ページの初期化時ではなくセッションが取得できた直後だと思い、よりよい方法を知りたいと思いました。
追記:マスターページのInitイベントはコンテンツページのInitイベントより先に発生するため、コンテンツページのInitイベントで行う処理があったとしても影響はありませんでした。しかし、コンテンツページのPreInitイベントはマスターページのInitより先に起きるようです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。