MVC RedirectToAction 在 global.asax 中调用 Session_Start()
MVC RedirectToAction calls Session_Start() in global.asax
我正在调用 RedirectToAction 方法来从另一个控制器调用操作方法,但它清除了所有会话数据
我在 global.asax 中调试,发现每当我调用 RedirectToAction 时,它都会调用 Session_Start() 方法。
我不知道如何调用会话开始。
这是我的表单和会话标签的网络配置代码
用于会话标签
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
以及表单标签
<authentication mode="Forms">
<forms loginUrl="~/ControllerName/ActionName" timeout="2880" />
</authentication>
这个“~/ControllerName/ActionName”与我调用的方法相同 "RedirecToAction"
仅供参考,我正在尝试的是,如果我为用户找到 cookie,他将直接从登录页面重定向到主页
两种操作方法在不同的控制器和不同的区域中。
这是使用 "RedirecToAction" 方法
的代码
public class LoginController : Controller{
public ActionResult Index()
{
if (Request.Cookies["UserName"] != null && Request.Cookies["Password"] != null)
{
FillLoginSession();//Fills Session with user data ex. Session["User_Id"] = 1;
return RedirectToAction("Index", "Home", new { area = "Home" });
}
}}
这是我重定向到的另一个控制器中的操作方法。
public class HomeController : Controller{
public ActionResult Index()
{
return View();
}}
表单身份验证和会话状态是两个不同且不相关的事物。
虽然您没有显示调用 RedirectToAction
的方法,但我怀疑您事先没有在会话状态中存储任何内容。 If you don't actually store something in Session State, you will get a new session on every request..
When using cookie-based session state, ASP.NET does not allocate storage for session data until the Session object is used. As a result, a new session ID is generated for each page request until the session object is accessed. If your application requires a static session ID for the entire session, you can either implement the Session_Start method in the application's Global.asax file and store data in the Session object to fix the session ID, or you can use code in another part of your application to explicitly store data in the Session object.
所以重申一下,要消除对 Session_Start
的调用,您需要在重定向之前将某些内容置于会话状态。
Session["TheKey"] = "TheValue";
return RedirectToAction("TheAction");
好的,我找到了这个问题的解决方案。
我打电话给这个
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
在从我的方法初始化会话之前。
在我的 IIS 中,此键 "ASP.NET_SessionId" 用于在 cookie 中存储会话。
当它被清除时,它会在我重定向到新页面时重新初始化所有内容。
我正在调用 RedirectToAction 方法来从另一个控制器调用操作方法,但它清除了所有会话数据 我在 global.asax 中调试,发现每当我调用 RedirectToAction 时,它都会调用 Session_Start() 方法。 我不知道如何调用会话开始。 这是我的表单和会话标签的网络配置代码
用于会话标签
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
以及表单标签
<authentication mode="Forms">
<forms loginUrl="~/ControllerName/ActionName" timeout="2880" />
</authentication>
这个“~/ControllerName/ActionName”与我调用的方法相同 "RedirecToAction"
仅供参考,我正在尝试的是,如果我为用户找到 cookie,他将直接从登录页面重定向到主页
两种操作方法在不同的控制器和不同的区域中。 这是使用 "RedirecToAction" 方法
的代码public class LoginController : Controller{
public ActionResult Index()
{
if (Request.Cookies["UserName"] != null && Request.Cookies["Password"] != null)
{
FillLoginSession();//Fills Session with user data ex. Session["User_Id"] = 1;
return RedirectToAction("Index", "Home", new { area = "Home" });
}
}}
这是我重定向到的另一个控制器中的操作方法。
public class HomeController : Controller{
public ActionResult Index()
{
return View();
}}
表单身份验证和会话状态是两个不同且不相关的事物。
虽然您没有显示调用 RedirectToAction
的方法,但我怀疑您事先没有在会话状态中存储任何内容。 If you don't actually store something in Session State, you will get a new session on every request..
When using cookie-based session state, ASP.NET does not allocate storage for session data until the Session object is used. As a result, a new session ID is generated for each page request until the session object is accessed. If your application requires a static session ID for the entire session, you can either implement the Session_Start method in the application's Global.asax file and store data in the Session object to fix the session ID, or you can use code in another part of your application to explicitly store data in the Session object.
所以重申一下,要消除对 Session_Start
的调用,您需要在重定向之前将某些内容置于会话状态。
Session["TheKey"] = "TheValue";
return RedirectToAction("TheAction");
好的,我找到了这个问题的解决方案。 我打电话给这个
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
在从我的方法初始化会话之前。 在我的 IIS 中,此键 "ASP.NET_SessionId" 用于在 cookie 中存储会话。 当它被清除时,它会在我重定向到新页面时重新初始化所有内容。