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

时间:2014-07-21 15:08:40

标签: c# asp.net asp.net-mvc forms-authentication session-management

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

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

  1. Global.asax下我正在尝试使用Session_End 调用LogOut方法,但这甚至在用户登录之前就会执行 英寸
  2. Global.asax下,我添加了Application_AcquireRequestState,但遗憾的是,这让许多对SSO服务的调用都让位。此外,它永远不会重定向到会话到期时登录。我用以下FormsAuthentication.RedirectToLoginPage()测试了它;没有运气。
  3. 我在Lex LiWhy HttpContext.Current be null?”找到了这个答案 - 它给了我一些关于我的问题可能是什么的见解,即使我的应用程序没有使用后台线程,我的{ {1}}随着一些随机请求返回Null,并不总是发生。

    会话管理器

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

3 个答案:

答案 0 :(得分:2)

正如评论中所确认的那样,您将应用程序池的Maximum number of worker processes设置为高于1 的值,并使用In-Process Mode进行会话状态。

我很确定这是 HttpContext.Current.Session随机空白而不是HttpContext.Current的问题。

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

在您的情况下,将Maximum number of worker processes设置为1可以解决问题。

enter image description here

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

答案 1 :(得分:1)

这听起来很可疑,因为它可能是类似于会话与表单身份验证时序问题 Forms Authentication Timeout vs Session Timeout

确保您的表单超时至少是会话超时的2倍。

答案 2 :(得分:0)

我认为您可能需要验证您是否在web.config中设置了此设置

<httpRuntime targetFramework="4.5" />

似乎您可能没有任务友好等待,这将导致此类意外行为。您可以参考此处similar problem and the solution

现在,您可能没有在您的使用中使用异步代码,但这并不意味着它没有被框架使用。无论如何,我认为值得一试。