Frage

Ich versuche, einen Hintergrunddienst in asp.net zu schaffen, die für die Sitzung Timeouts überprüft und leitet den Benutzer auf eine Timeout-Seite (nicht die Login-Seite). Mein Code ist wie folgt

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

Das Problem hier ist, dass ich nicht in der Lage bin den Sitzungswert in der CheckSessionTimeout Methode zu erhalten. Es ist immer null. Wie kann hier die Session erhalten.

Ich habe unter diese Lösung gesucht, aber es tut Hilfe.

War es hilfreich?

Lösung

Ich fürchte, Sie auf dem Holzweg sind hier. Sie können nicht einen Hintergrunddienst unter Verwendung eines Httpmodule wie dies umzusetzen. Die Httpcontext Sie herum sind vorbei an einer HTTP-Anforderung gebunden ist, und ich bin ganz sicher, Sie sollten es nicht halten um wie Sie zu tun versuchen. Auch selbst wenn Sie den Sitzungs-Timeouts erkennen könnten, gäbe es keine Möglichkeit, den Benutzer auf eine neue Seite ohne eine aktive Anfrage zu umleiten.
Sie könnten finden diese fädeln hilfreich.

Andere Tipps

Ich denke, es ist ein logischer Fehler hier, auch wenn Sie Ihren Code zu beheben, werden Sie nie eine ended Sitzung erhalten.

Wenn Sie zu einer Sitzung zugreifen können, wird es eine sessionID hat. Sie können eine Sitzung erhalten, die durch Timeout auf diese Weise beendet.

Vielleicht sollten Sie global.asax die Session_End verwenden. aber ich bin nicht sicher, es wird helfen.

Auch hier Sie sehen können, ist SessionID nicht bis Session.Abandon ersetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top