前提・実現したいこと
ASP.NET MVC5を使用してWebシステムを作成しています。質問はセッションタイムアウトの処理方法です。
セッション管理はInProcモードです。
セッションタイムアウトはデフォルトの20分です。
セッションタイムアウトのチェックはアクションフィルター(OnActionExecuting)を使用しています。アクションフィルターは、セッションタイムアウトが発生すると、強制的にセッションタイムアウト画面に遷移します。このため、セッションタイムアウトが発生すると、URLに示すControllerのアクションメソッドには制御は移りません。
発生している問題・エラーメッセージ
月に一回程度の頻度で、URLに示すControllerのアクションメソッドで、Sessionオブジェクトが未定義のNull参照エラーが発生しています。
Sessionオブジェクトはログイン成功時に必ず設定しているため、このオブジェクトがNullになるのはセッションタイムアウト時のみです。
エラーメッセージ
Object reference not set to an instance of an object.
該当のソースコード
アクションフィルタのコードです。
public
1 { 2 public override void OnActionExecuting(ActionExecutingContext filterContext) 3 { 4 base.OnActionExecuting(filterContext); 5 6 HttpContext context = HttpContext.Current; 7 8 // セッション管理は有効か? 9 if (context.Session != null) 10 { 11 // 新しいセッションIdが生成されたか? 12 if (context.Session.IsNewSession) 13 { 14 // 新しいクッキーが存在するなら、セッションタイムアウトと見なす 15 string sessionCookie = context.Request.Headers["Cookie"]; 16 if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 17 { 18 // セッションタイムアウト画面へリダイレクトする 19 filterContext.Result=new RedirectResult("~/Account/SessionTimeOut"); 20 } 21 } 22 } 23 24 } 25 }
### エラーが発生したコード
public ActionResult RegisterCommon(DateTime displayDay) { // 担当を自由に変更できる期間は2週間前まで var timeLimitDay = displayDay.AddDays(-14); // 本日 var today = DateTime.Now.ToUniversalTime().AddHours(9).Date; // ユーザのIDを読み取る var membershipId = (string)Session["MEMBERSHIP_ID"]; // 代行処理の場合、代行される人のIDを設定 if ((String)Session["SUBSTITUTED_ID"] != null) { membershipId = (string)Session["SUBSTITUTED_ID"]; } // 事務局か? var isAdministrator = false; if ((bool)Session["ADMINISTRATOR"]) <<<--ここで例外が発生 isAdministrator = true; // 指定日の担当登録を全て読み取る var tantoItemsInDay = new List<Tanto>(); tantoItemsInDay = db.TantoTbl .Where(item => item.Date == displayDay) .ToList(); ・・・・・・・ return View("Register", model); }
試したこと
エラーが発生しているControllerアクションメソッドでセッションタイムアウトを発生させて確認しましたが、正しくセッションタイムアウトを認識し、Null参照エラーは発生しません。
疑わしいのは、セッションタイムアウト判定アルゴリズムと睨んでいるのですが、ASP.NETにおけるセッションタイムアウト処理の情報が少なく、悩んでいます。
なお、使用しているセッションタイムアウト判定アルゴリズムはstackOverflowに掲載されていたコードを使っています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー