Question

Je suis en train de créer un service d'arrière-plan asp.net qui vérifie les délais d'attente de session et redirige l'utilisateur vers une page d'attente (pas la page de connexion). Mon code est comme ceci

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

Le problème est que je ne suis pas en mesure d'obtenir la valeur de session dans la méthode CheckSessionTimeout. Il est toujours nulle. Comment obtenir la session ici.

Je l'ai regardé cette solution mais il ne marche pas aide.

Était-ce utile?

La solution

Je crains que vous êtes sur la mauvaise voie ici. Vous ne pouvez pas mettre en œuvre un service de base en utilisant un HttpModule comme celui-ci. Le HttpContext vous passez est autour lié à une requête HTTP, et je suis tout à fait sûr que vous ne devriez pas le garder autour comme vous essayez de le faire. De plus, même si vous pouvez détecter la session time-out, il n'y aurait aucun moyen de rediriger l'utilisateur vers une nouvelle page sans une demande active.
Vous trouverez peut-être cette fil utile.

Autres conseils

Je pense qu'il ya une erreur logique ici, même si vous fixez votre code, vous ne serez jamais obtenir une session ended.

si vous pouvez accéder à une session, il aura une idSession. Vous ne pouvez pas obtenir une session qui a pris fin par expiration de cette façon.

Peut-être que vous devriez utiliser le Session_End de global.asax. mais je ne suis pas sûr que ça va aider.

ici vous pouvez voir, SessionID n'est pas remplacé jusqu'à Session.Abandon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top