O Session Manager não será desconectado quando a sessão expirar, HTTPContext.Current é Null

Estou tendo esse problema com meu gerenciador de sessões atual; quando a sessão expirar, não efetuará logoff do usuário.

Em intervalos aleatórios enquanto o usuário está logado noHttpContext.Current éNULL fazendo com que o site gere muitos erros. Eu tentei algumas técnicas para redirecionar o usuário para o login após a expiração da sessão, sem sucesso.

SobGlobal.asax Estou fazendo uso deSession_End pode tentar ligarLogOut , mas isso é executado mesmo antes do usuário efetuar login.SobGlobal.asax Eu adicioneiApplication_AcquireRequestState, mas infelizmente isso abre caminho para muitas chamadas para o serviço SSO. Além disso, ele nunca é redirecionado para o login após a expiração da sessão. Eu testei com o seguinteFormsAuthentication.RedirectToLoginPage(); Sem sorte

Encontrei esta resposta porLex Li "Por que HttpContext.Current ser nulo?"- me deu algumas dicas sobre qual poderia ser meu problema, mesmo que meu aplicativo não faça uso de threads de segundo plano, meuHttpContext.Current volta Nulo com alguns pedidos aleatórios, nem sempre acontece.

Gerenciador de sessões

   public class SessionManager
    {
        private const string SessionKey = "AppSession";

        private SessionManager()
        {
            GUID                  = new Guid();
            FirstName             = String.Empty;
            LastName              = String.Empty;
            Email                 = String.Empty;
            SessionExpiration     = new DateTime();
        }

        // Gets the current session.
        public static SessionManager Current
        {
            get
            {
                if(HttpContext.Current != null)
                {
                    if (HttpContext.Current.Session[SessionKey] == null)
                    {
                        var model = new SessionManager();
                        HttpContext.Current.Session[SessionKey] = model;
                    }
                    return (SessionManager)HttpContext.Current.Session[SessionKey];
                }
                else
                {
                    return null;
                }
            }

        }

        public static void LogOffUser()
        {
            //SSO is a seperate service, I need to stay insync.
            var ssoAuth = new SSOAuth(); 
            if(Current != null)
               ssoAuth.SSOLogoffUser(Current.GUID);

            FormsAuthentication.SignOut();  
            FormsAuthentication.RedirectToLoginPage();
        }

        public Guid GUID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public DateTime SessionExpiration { get; set; }
    }

Controlador de login

[HttpPost]
[AllowAnonymous]
public JsonResult Login(LoginViewModel user)
{
    var ssoAuth = new SSOAuth();
    var sessionObject = ssoAuth.SSOLoginUser(user.Email, user.Password);

    if (sessionObject != null && sessionObject.SessionId != Guid.Empty)
    {
        SessionManager.Current.Email                 = sessionObject.UserId;
        SessionManager.Current.GUID                  = sessionObject.SessionId;
        SessionManager.Current.FirstName             = sessionObject.FirstName;
        SessionManager.Current.LastName              = sessionObject.LastName;
        SessionManager.Current.SessionExpiration     = sessionObject.SessionExpiration;

        //Grab difference in time to get session timeout in minutes.
        var differenceInTime = SessionManager.Current.SessionExpiration - DateTime.Now;
        Session.Timeout = differenceInTime.Minutes;

        //Authenticate user
        FormsAuthentication.SetAuthCookie(user.Email, false);

        //We return JSON, Its an AJAX Call.
        return Json(new
        {
            redirectUrl = "/Home.mvc/Home/Index",
            isRedirect = true
        });
    }

    return Json(new
    {
        redirectUrl = string.Empty,
        isRedirect = false
    });
}

questionAnswers(3)

yourAnswerToTheQuestion