Диспетчер сеансов не выйдет из системы после окончания сеанса, HTTPContext.Current равен Null

У меня возникла эта проблема с моим текущим менеджером сеансов, когда сеанс истекает, он не выйдет из системы.

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

ПодGlobal.asax Я используюSession_End может попытаться позвонитьLogOut метод, но он выполняется еще до входа пользователя.ПодGlobal.asax я добавилApplication_AcquireRequestState, но, к сожалению, это делает много звонков в службу единого входа. Кроме того, он никогда не перенаправляется для входа в систему по истечении сеанса. Я проверил это со следующимFormsAuthentication.RedirectToLoginPage(); Неудачно.

Я нашел этот ответЛекс Ли "Почему HttpContext.Current будет нулевым?"- это дало мне некоторое представление о том, в чем может быть моя проблема, хотя мое приложение не использует фоновые потоки, мойHttpContext.Current возвращается с нулевым с некоторыми случайными запросами, не всегда происходит.

Менеджер сессий

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

Контроллер входа

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

Ответы на вопрос(3)

Ваш ответ на вопрос