0

セッションのタイムアウトをチェックし、ユーザーを (ログイン ページではなく) タイムアウト ページにリダイレクトするバックグラウンド サービスを asp.net で作成しようとしています。私のコードはこのようなものです

public class SessionTimeoutModule : IHttpModule
{
    private static Timer timer;
    //Test value
    private const int interval = 1000 * 1 * 10;

    public void Init( HttpApplication application )
    {
        if ( timer == null )
        {
            timer = new Timer( new TimerCallback( CheckSessionTimeout ),
                         application.Context, 0, interval );
        }
    }

    private void CheckSessionTimeout( object sender )
    {
        HttpContext ctx = (HttpContext)sender;

        if ( ctx.Session != null && ctx.Session.IsNewSession )
        {
            var cookie = ctx.Request.Headers["Cookie"];
            if ( cookie != null )
            {
                if ( cookie.ToUpper().IndexOf( "ASP.NET_SESSIONID" ) >= 0 )
                {
                    ctx.Response.Redirect( "" );
                }
            }
        }
    }

    public void Dispose()
    {
        timer = null;
    }
}

ここでの問題は、CheckSessionTimeout メソッドでセッション値を取得できないことです。常にヌルです。ここでセッションを取得する方法。

私はこの解決策を見てきましたが、役に立ちません。

4

2 に答える 2

1

ここであなたが間違った道を進んでいるのではないかと心配しています。このような HttpModule を使用してバックグラウンド サービスを実装することはできません。あなたが渡している HttpContext は HTTP リクエストにバインドされています。また、セッション タイムアウトを検出できたとしても、アクティブなリクエストがなければ、ユーザーを新しいページにリダイレクトする方法はありません。 このスレッドが役に立つ
かもしれません。

于 2009-02-24T16:21:36.233 に答える
0

ここには論理的な間違いがあると思います。コードを修正しても、セッションが終了することはありません。

セッションにアクセスできる場合は、sessionID があります。この方法では、タイムアウトで終了したセッションを取得できません。

おそらく、global.asax の session_end を使用する必要があります。しかし、それが役立つかどうかはわかりません。

また、ここでわかるように、SessionID は Session.Abandon まで置き換えられません。

于 2009-02-24T16:17:18.473 に答える