Доступ к сеансу в фоновой службе с помощью HttpModule

StackOverflow https://stackoverflow.com/questions/582222

  •  06-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать фоновую службу в asp.net, которая проверяет наличие тайм-аутов сеанса и перенаправляет пользователя на страницу тайм-аута (не страницу входа в систему).Мой код выглядит следующим образом

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

Проблема здесь в том, что я не могу получить значение сеанса в методе CheckSessionTimeout .Оно всегда равно нулю.Как можно получить Сеанс здесь.

Я посмотрел на это решение, но это не помогает.

Это было полезно?

Решение

Боюсь, здесь вы на ложном пути.Вы не можете реализовать фоновую службу, используя HttpModule, подобный этому.HttpContext, который вы передаете, привязан к HTTP-запросу, и я совершенно уверен, что вам не следует хранить его так, как вы пытаетесь сделать.Кроме того, даже если бы вы могли обнаружить время ожидания сеанса, не было бы никакого способа перенаправить пользователя на новую страницу без активного запроса.
Вы могли бы найти этот поток полезный.

Другие советы

Я думаю, что здесь есть логическая ошибка, даже если вы исправите свой код, вы никогда не получите завершенный сеанс.

если вы можете получить доступ к сеансу, у него будет идентификатор сеанса.Таким образом, вы не можете получить сеанс, который завершился по таймауту.

Возможно, вам следует использовать session_end глобального.asax .но я не уверен, что это поможет.

Также здесь , внутри вы можете видеть, SessionID не заменяется до сеанса.Отказаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top