Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FormsAuthentication.RedirectToLoginPage()不执行任何操作_C#_Asp.net_.net_Session_Session State - Fatal编程技术网

C# FormsAuthentication.RedirectToLoginPage()不执行任何操作

C# FormsAuthentication.RedirectToLoginPage()不执行任何操作,c#,asp.net,.net,session,session-state,C#,Asp.net,.net,Session,Session State,我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException 为了避免这种情况,我的页面会检查此信息是否存在,如果为空,则会将用户重定向到登录页面forms auth,因此我调用: void LogOut() { Session.Clear(); Session.Abandon(); User = null; FormsAuthentication.SignOut(

我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException

为了避免这种情况,我的页面会检查此信息是否存在,如果为空,则会将用户重定向到登录页面forms auth,因此我调用:

void LogOut()
{
    Session.Clear();
    Session.Abandon();
    User = null;
    FormsAuthentication.SignOut();
    FormsAuthentication.RedirectToLoginPage()
}
但有时也没用,所以我找到了一个解决办法:

Response.Redirect(FormsAuthentication.LoginUrl);
但它没有添加returnUrl,我希望它是我不想手动模拟这种行为

所以我想弄明白为什么第一种方法不能像预期的那样工作

我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException

但有时也没用

我不确定你所说的有时没有帮助是什么意思——你没有说到底发生了什么

但您应该记住,表单身份验证票证的过期和会话超时的过期是完全独立的。当用户的窗体身份验证票证仍然有效时,其会话可能会超时,反之亦然

通常,从会话访问数据时,应始终首先测试数据是否存在,并在必要时刷新数据:

object o = Session["Whatever"];
if (o == null)
{
    o = ... refresh it e.g. from the database
    Session["Whatever"] = o;
}
...
通常,使用助手类来封装这一点很有用

在您的例子中,您引用了其他用户信息-因此您可能能够使用HttpContext.Current.user.Identity.Name作为密钥检索此信息

由于会话已过期(例如,由于服务器上的应用程序池回收),强制用户再次登录是非常不友好的

更新

MSDN文件规定:

与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.end来结束请求。这意味着将运行RedirectToLoginPage方法调用后面的代码

这可能解释了您所看到的情况:调用RedirectToLoginPage后,页面生命周期中的代码正在运行,并引发NullReferenceException

您可以在RedirectToLoginPage之后调用Response.End以避免此情况


My Session timeout set=通过web.config形成身份验证超时

我将再次重申,会话到期和FormsAuthentication到期是不相关的,即使超时恰好相同。FormsAuthenticationCookie将在服务器上的应用程序池循环中生存;会议将不会结束

我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException

但有时也没用

我不确定你所说的有时没有帮助是什么意思——你没有说到底发生了什么

但您应该记住,表单身份验证票证的过期和会话超时的过期是完全独立的。当用户的窗体身份验证票证仍然有效时,其会话可能会超时,反之亦然

通常,从会话访问数据时,应始终首先测试数据是否存在,并在必要时刷新数据:

object o = Session["Whatever"];
if (o == null)
{
    o = ... refresh it e.g. from the database
    Session["Whatever"] = o;
}
...
通常,使用助手类来封装这一点很有用

在您的例子中,您引用了其他用户信息-因此您可能能够使用HttpContext.Current.user.Identity.Name作为密钥检索此信息

由于会话已过期(例如,由于服务器上的应用程序池回收),强制用户再次登录是非常不友好的

更新

MSDN文件规定:

与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.end来结束请求。这意味着将运行RedirectToLoginPage方法调用后面的代码

这可能解释了您所看到的情况:调用RedirectToLoginPage后,页面生命周期中的代码正在运行,并引发NullReferenceException

您可以在RedirectToLoginPage之后调用Response.End以避免此情况


My Session timeout set=通过web.config形成身份验证超时


我将再次重申,会话到期和FormsAuthentication到期是不相关的,即使超时恰好相同。FormsAuthenticationCookie将在服务器上的应用程序池循环中生存;会话将不可用。

是否尝试呼叫响应。在FormsAuthentication.RedirectToLoginPage之后结束?

是否尝试呼叫响应。在FormsAuthentication.RedirectToLoginPage之后结束?

感谢您的响应。发生了什么和没有发生什么:RedirectToLoginPage什么都不做-代码提前执行,我得到了NullReferenceException,因为在会话中保留有关当前用户的更多信息一些链接对象,例如ClientCompanyNameMy session timeout set=Forms auth timeout via web.config。用户将被forms auth自动重定向到登录页面,这将按预期工作。但是我的情况
更多的开发/部署过程是否相关:发布新版本后,我希望被重定向到登录页面,并且不获取NullReferenceException。感谢您的回复。发生了什么和没有发生什么:RedirectToLoginPage什么都不做-代码提前执行,我得到了NullReferenceException,因为在会话中保留有关当前用户的更多信息一些链接对象,例如ClientCompanyNameMy session timeout set=Forms auth timeout via web.config。用户将被forms auth自动重定向到登录页面,这将按预期工作。但我的场景与开发/部署过程更为相关:发布新版本后,我希望被重定向到登录页面,并且不获取NullReferenceException。