当会话过期时,会话管理器不会将我注销,HTTPContext.Current 为 Null

2024-04-10

我当前的会话管理器遇到这个问题,当会话过期时,它不会注销用户。

用户登录时以随机间隔HttpContext.Current is NULL导致网站产生许多错误。我尝试了几种技术来在会话过期时重定向用户登录,但没有成功。

  1. Under Global.asax我正在利用Session_End可以尝试 称呼LogOut方法,但这甚至在用户登录之前就被执行 在。
  2. Under Global.asax我添加了Application_AcquireRequestState,但遗憾的是,这导致了对 SSO 服务的许多调用。此外,它永远不会在会话过期时重定向到登录。我用以下方法测试了它FormsAuthentication.RedirectToLoginPage();没有运气。

我找到了这个答案Lex Li https://stackoverflow.com/users/11182/lex-li "为什么 HttpContext.Current 为空? https://stackoverflow.com/questions/19509672/why-httpcontext-current-be-null“ - 它让我对我的问题可能是什么有了一些了解,即使我的应用程序没有使用后台线程,我的HttpContext.Current一些随机请求返回 Null,并不总是发生。

会话管理器

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

正如评论中所确认的,您正在设置应用程序池的Maximum number of worker processes到一个值高于1并使用In-Process Mode对于会话状态。

我很确定这是问题所在HttpContext.Current.Session随机为空代替HttpContext.Current.

InProc会话状态和multiple working processes 不兼容. With InProc会话状态,您的会话状态存储在工作进程内存中并且不在工作进程之间共享=> 当您的请求由不同的进程提供服务时,这会导致会话状态随机丢失。

在你的情况下,设置Maximum number of worker processes改为 1 应该可以解决问题。

如果您正在寻找多工作进程解决方案,您应该使用会话状态服务或数据库将会话状态存储在进程外:http://tutorials.csharp-online.net/ASP.NET_State_Management%E2%80%94Storing_Session_State_out_of_Process http://tutorials.csharp-online.net/ASP.NET_State_Management%E2%80%94Storing_Session_State_out_of_Process

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当会话过期时,会话管理器不会将我注销,HTTPContext.Current 为 Null 的相关文章

随机推荐