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 方法中获取会话值。它始终为空。怎么能在这里得到Session。

我看过这个解决方案,但它没有帮助。

4

2 回答 2

1

恐怕你在这里走错了路。您不能像这样使用 HttpModule 实现后台服务。你传递的 HttpContext 绑定到一个 HTTP 请求,我很确定你不应该像你试图做的那样保留它。此外,即使您可以检测到会话超时,也无法在没有活动请求的情况下将用户重定向到新页面。
您可能会发现此线程很有帮助。

于 2009-02-24T16:21:36.233 回答
0

我认为这里有一个逻辑错误,即使您修复了代码,也永远不会结束会话。

如果您可以访问会话,它将有一个 sessionID。通过这种方式,您无法获得以超时结束的会话。

也许你应该使用 global.asax 的 session_end。但我不确定它会有所帮助。

同样在这里您可以看到,直到 Session.Abandon 才替换 SessionID。

于 2009-02-24T16:17:18.473 回答