2011-06-27 30 views
4

特定の期間が経過した後にセッションをタイムアウトさせたいASP.NET 3.5 Webフォームアプリケーションを開発しています。その後、ユーザーが何かをしようとすると、アプリケーションは、セッションがタイムアウトしたことを示すページにそれらをリダイレクトし、それらを再開始する必要があるはずです。私が知る限り、かなり標準的なものです。ASP.NET Webアプリケーションでセッションがタイムアウトしていない

ただし、Visual StudioまたはIISから実行しているこの機能をテストするために、セッションタイムアウトを設定できないようです。ここでは、web.configファイルで私のセッション状態の設定があります:

<sessionState mode="SQLServer" 
       allowCustomSqlDatabase="true" 
       sqlConnectionString="<ConnectionString>" 
       cookieless="false" 
       timeout="1" /> 

ここで私は、セッションタイムアウトのためにテストしています方法は次のとおりです。

public bool IsSessionTimeout 
{ 
    get 
    { 
     // If the session says its a new session, but a cookie exists, then the session has timed out. 
     if (Context.Session != null && Session.IsNewSession) 
     { 
      string cookie = Request.Headers["Cookie"]; 
      return !string.IsNullOrEmpty(cookie) && cookie.IndexOf("ASP.NET_SessionId") >= 0; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

Session.IsNewSessionはいつものSession_Endメソッドので、理にかなっている、falseを返すことが表示されます私のGlobal.asax.csでは決して呼び出されません。私は何が欠けていますか?私のサイトのいずれかのための私のマスターページのpage_initに

 if (Session["myUser"] != null) 
      myUser = (User)Session["myUser"]; 
     else 
      myUser = null; 

     //User must be logged in, if not redirect to the login page - unless we are already running the login page. 
     if ((myUser == null) && (Request.Url.AbsolutePath != "/Login.aspx")) 
      Response.Redirect("Login.aspx?Mode=Timeout", true); 

+3

私はのSession_Endのみプロセスセッションで求められていると信じています。期限切れ後に新しいIDが生成されるかどうかを確認するには、セッションIDを確認してください。 –

答えて

1

ここで私は実装が終了しました。 Global.asax.csで

:私のページ基本クラスで

protected void Session_Start(object sender, EventArgs e) 
{ 
    Session[SessionKeys.SessionStart] = DateTime.Now; 
} 

public bool IsSessionTimeout 
{ 
    get 
    { 
     DateTime? sessionStart = Session[SessionKeys.SessionStart] as DateTime?; 
     bool isTimeout = false; 

     if (!sessionStart.HasValue) 
     { 
      // If sessionStart doesn't have a value, the session has been cleared, 
      // so assume a timeout has occurred.    
      isTimeout = true; 
     } 
     else 
     { 
      // Otherwise, check the elapsed time. 
      TimeSpan elapsed = DateTime.Now - sessionStart.Value; 
      isTimeout = elapsed.TotalMinutes > Session.Timeout; 
     } 

     Session[SessionKeys.SessionStart] = DateTime.Now; 
     return isTimeout; 
    } 
} 
2

私はこれを行います。あなたはそれをあなたが望むものに対して非常に簡単に適応させることができます。基本的には、セッション中に存在する必要があるものがないかどうかを確認してください。セッションがタイムアウトしていれば、適切な処置を取ることができます。

私の場合、ログインページにリダイレクトされます。あなたのケースでは、彼らがあなたの 'プロセス'が何であるかを開始するたびに、あなたはセッション変数を設定します。すべてのページ要求で、その項目がまだセッションに存在するかどうかを確認します。

+0

私はあなたの答えを見て、私はそれが私の問題を解決するだろうと思ったが、何らかの理由で、私のセッションオブジェクトは、タイムアウト期間が経過した後もまだ存在します。私は、SQL Serverが適切に設定されていない可能性があると思いますが、残念ながら、私はそれ以上のコントロールはありません。私が実装を終えたのは、あなたの答えと経過時間のマニュアルチェックを組み合わせたものです。 – FishBasketGordo

関連する問題