我的当前会话管理器遇到此问题,当会话过期时,它不会注销用户。
在用户登录时,以HttpContext.Current
为NULL
的随机间隔导致网站产生许多错误。我尝试了几种技术,在会话到期时将用户重定向到登录,但没有成功。
Global.asax
下我正在尝试使用Session_End
调用LogOut
方法,但这甚至在用户登录之前就会执行
英寸Global.asax
下,我添加了Application_AcquireRequestState
,但遗憾的是,这让许多对SSO服务的调用都让位。此外,它永远不会重定向到会话到期时登录。我用以下FormsAuthentication.RedirectToLoginPage()
测试了它;没有运气。我在Lex Li“Why 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; }
}
答案 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可以解决问题。
如果您正在寻找多个工作流程解决方案,则应使用会话状态服务或数据库将会话状态存储在流程外: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。
现在,您可能没有在您的使用中使用异步代码,但这并不意味着它没有被框架使用。无论如何,我认为值得一试。