Pregunta

Estoy tratando de crear un servicio en segundo plano en asp.net que comprueba los tiempos de espera de sesión y redirige al usuario a una página de tiempo de espera (no la página de inicio de sesión). Mi código es como esto

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

El problema aquí es que no soy capaz de obtener el valor de la sesión en el método CheckSessionTimeout. Siempre es nula. ¿Cómo se puede conseguir la Sesión aquí.

He mirado esta solución pero, duerma ayuda.

¿Fue útil?

Solución

Me temo que está en el camino equivocado aquí. No se puede implementar un servicio en segundo plano usando un HttpModule como este. El HttpContext que está pasando alrededor se une a una solicitud HTTP, y estoy bastante seguro de que no debe ser conservado por ahí como que estamos tratando de hacer. Además, incluso si se pudiera detectar la sesión de tiempo de espera, no habría manera de redirigir al usuario a una nueva página sin una petición activa.
Usted puede encontrar esta enhebrar útil.

Otros consejos

Creo que hay un error lógico aquí, incluso si se fija su código, nunca se tiene una sesión de composición.

si puede acceder a una sesión, que tendrá un Id.sesión. No se puede obtener una sesión que terminó por tiempo de espera de esta manera.

Tal vez deberías utilizar Session_End de global.asax. pero no estoy seguro de que ayudará.

aquí se puede ver, SessionID no se reemplaza hasta Session.Abandon.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top