0

asp.netアプリケーションでセッション状態のタイムアウトを検出しようとしていますが、検出できません。System.Web.UI.Pageから次のように派生する基本クラスがあります。-

public class BasePageSessionExpire : Page
{
    override protected void OnInit(EventArgs e)
    {
        base.OnInit(e); 
        if (Context.Session != null)
        {                
            if (Session.IsNewSession)
            {                    
                string szCookieHeader = Request.Headers["Cookie"];
                if ((null != szCookieHeader) && (szCookieHeader.IndexOf("ASP.NET_SessionId") > 0))
                {
                    Session.Abandon();
                    Response.Redirect("~/SessionExpired.aspx",true);
                }
            }
        }
    }
}

セッション状態のチェックが必要なすべてのページは、「System.Web.UI.Page」ではなく、この基本クラスから派生しています。また、これらすべてのページにはEnableSessionState="True"があります。まったく関係がない場合は、global.asaxファイルに空白のSession_Start()メソッドがあります。

最初のリクエスト後の何らかの理由で、「Session.IsNewSession」プロパティは常にfalseです。これは最初の要求に対してのみ真であり、その後は常に偽です。タイムアウトを1分に設定しています。セッションがタイムアウトすることはありません。ここで何が欠けていますか?

また、SQL Server 2008で状態サーバーを実装しました。これは、インプロセスセッション状態の実装ではありません。

前もって感謝します。

4

3 に答える 3

2

global.asax ファイルに Session_start イベントがあるため、セッションの有効期限が切れた後、Session_start が再び発生します。これは、セッション ID が既に作成されていることを意味し、セッション ID が既に作成されているため、oninit イベント IsNewSessionId は false を返します。

したがって、Session_Start イベントを削除すると機能します。

この解決策がうまくいくかどうか教えてください。

于 2011-12-01T03:44:00.533 に答える
0

ASP.Net セッションは、サーバーに対するユーザーの最初の要求で開始されます。これはIsNewSession真実になる唯一の時です。

Session.Abandon() を呼び出すと現在のセッションが削除され、ユーザーを SessionExpired ページにリダイレクトすると、新しいセッションが開始されます。

タイムアウトが発生しない理由がわかりません。Global.asax Session_End イベントにコードを挿入して、セッションが終了していないことを確認しましたか?

于 2010-04-13T20:36:01.767 に答える
0

あなたのアプリケーションでは、Session_StartイベントがIsNewSessionない場合、セッションに値を保存しない限り、ポストバックごとに毎回trueが返されます。

セッションに何らかの値を保存すると、IsNewSession次に多くのポストバックがあったとしても false が返されます。

セッションが期限切れにIsNewSessionなると、セッションが保存されなくなるまで true を返します。

于 2011-12-01T03:48:15.820 に答える