【问题标题】:Accessing Session in background service using HttpModule使用 HttpModule 访问后台服务中的 Session
【发布时间】:2011-01-24 23:31:09
【问题描述】:

我正在尝试在 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。

我查看了this 解决方案,但没有帮助。

【问题讨论】:

    标签: asp.net background-service


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      还有in here你可以看到,SessionID直到Session.Abandon才被替换。

      【讨论】:

      • 据我观察,当会话结束时 IsNewSession 属性设置为 true ,这就是我添加 ctx.Session.IsNewSession 检查以便我可以验证它的原因。即使这样,我认为csgero所说的是真的。无论如何感谢您的回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多