Domanda

Sto cercando di creare un servizio in background in asp.net che controlla per il timeout di sessione e reindirizza l'utente a una pagina di timeout (non la pagina di login). Il mio codice è come questo

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

Il problema è che io non sono in grado di ottenere il valore di sessione nel metodo CheckSessionTimeout. E 'sempre nullo. Come si può ottenere la sessione qui.

Ho guardato questa soluzione ma doesnt aiuto.

È stato utile?

Soluzione

Ho paura si è sulla strada sbagliata qui. Non si può implementare un servizio in background utilizzando un HttpModule come questo. Il HttpContext si sta passando in giro è legato a una richiesta HTTP, e sono abbastanza sicuro che non si dovrebbe tenere in giro come si sta cercando di fare. Inoltre, anche se si potrebbe rilevare il timeout di sessione, non ci sarebbe alcun modo per reindirizzare l'utente a una nuova pagina senza una richiesta attiva.
Si potrebbe trovare questo infilare utile.

Altri suggerimenti

Credo che ci sia un errore logica qui, anche se a risolvere il tuo codice, non si sarà mai ottenere una sessione si è conclusa.

se è possibile accedere a una sessione, che avrà un sessionID. Non è possibile ottenere una sessione che si è concluso per timeout in questo modo.

Forse si dovrebbe usare Session_End di global.asax. ma io non sono sicuro che sarà di aiuto.

qui si può vedere, SessionID non viene sostituito fino Session.Abandon.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top