我遇到以下问题:重新发布ASP.NET Web应用程序会导致(按预期方式)会话重置,我会保留其他用户信息(访问尝试时会导致NullReferenceException)。
为了避免这种情况,我的页面检查此信息是否存在,如果null将用户重定向到登录页面(表单auth),所以我正在调用:
void LogOut()
{
Session.Clear();
Session.Abandon();
User = null;
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage()
}
但有时它没有帮助,所以我找到了一个解决方法:
Response.Redirect(FormsAuthentication.LoginUrl);
但它没有添加returnUrl,我希望它是什么(我不想手动模拟这种行为)。
所以想弄清楚为什么第一种方法不能按预期工作。
答案 0 :(得分:5)
您是否尝试在Response.End()
之后致电FormsAuthentication.RedirectToLoginPage()
?
答案 1 :(得分:1)
我遇到以下问题:重新发布ASP.NET Web应用程序会导致(按预期方式)会话重置,我会保留其他用户信息(访问尝试时会导致NullReferenceException)。
但有时它无济于事
我不确定你的意思是“有时它无济于事” - 你没有说明究竟发生了什么。
但是您应该记住,表单身份验证票证的到期和会话超时的到期是完全独立的。用户的会话可以在其表单身份验证票证仍然有效时超时,反之亦然。
通常,从Session访问数据时,您应该首先测试存在,并在必要时刷新它:
object o = Session["Whatever"];
if (o == null)
{
o = ... refresh it e.g. from the database
Session["Whatever"] = o;
}
...
通常使用辅助类来封装它是很有用的。
在您的情况下,您可以参考“其他用户信息” - 因此您可能可以使用HttpContext.Current.User.Identity.Name
作为密钥来检索此信息。
强制用户因会话已过期而再次登录,例如因为服务器上的应用程序池回收,非常不友好。
<强>更新强>
RedirectToLoginPage的MSDN文档指出:
与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.End来结束请求。这意味着将运行RedirectToLoginPage方法调用之后的代码。
这可能解释了您所看到的内容:致电RedirectToLoginPage
后页面生命周期中的代码正在运行,并抛出NullReferenceException
。
您可以在Response.End
之后致电RedirectToLoginPage
以避免这种情况。
My Session timeout set = Forms auth timeout(通过web.config)。
我会重新尝试会话到期,并且FormsAuthentication到期是无关的,即使超时恰好相同。 FormsAuthentication cookie将在服务器上的应用程序池回收中存活;会议不会。