Pergunta

Eu estou tentando criar um serviço de fundo em asp.net, que verifica a existência de tempo limite de sessão e redireciona o usuário para uma página de tempo limite (não a página de login). Meu código é assim

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;
    }
}

O problema aqui é que eu não sou capaz de obter o valor da sessão no método CheckSessionTimeout. É sempre nulo. Como pode obter a sessão aqui.

Eu olhei esta solução mas esquentar ajuda.

Foi útil?

Solução

Eu tenho medo que você está no caminho errado aqui. Você não pode implementar um serviço de fundo usando um HttpModule como esta. O HttpContext que você está passando em torno é obrigado a uma solicitação HTTP, e estou certa de que você não deve mantê-lo em torno de como você está tentando fazer. Além disso, mesmo se você pudesse detectar o tempo limite de sessão, não haveria maneira de redirecionar o usuário para uma nova página sem um pedido ativo.
Você pode achar este enrosque útil.

Outras dicas

Eu acho que há um erro lógico aqui, mesmo se você corrigir o seu código, você nunca vai ter uma sessão terminou.

Se você pode acessar a uma sessão, ele terá um sessionID. Você não pode começar uma sessão que terminou por tempo de espera por este caminho.

Talvez você deve usar Session_End do global.asax. mas eu não tenho certeza que ele vai ajudar.

aqui você pode ver, SessionID não é substituído até Session.Abandon.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top