Accedere sessione in servizio in background utilizzando HttpModule
-
06-09-2019 - |
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.
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.