MVC RedirectToAction 在 global.asax 中调用 Session_Start()
Posted
技术标签:
【中文标题】MVC RedirectToAction 在 global.asax 中调用 Session_Start()【英文标题】:MVC RedirectToAction calls Session_Start() in global.asax 【发布时间】:2016-05-16 08:48:04 【问题描述】:我正在调用 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();
【问题讨论】:
【参考方案1】:好的,我已经解决了这个问题。 我叫这个
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
在从我的方法初始化会话之前。 在我的 IIS 中,这个键“ASP.NET_SessionId”用于在 cookie 中存储会话。 当它被清除时,它会在我重定向到新页面时重新初始化所有内容。
【讨论】:
【参考方案2】:表单身份验证和会话状态是两个不同且不相关的东西。
虽然您没有显示调用RedirectToAction
的方法,但我怀疑您没有事先在会话状态中存储任何内容。 If you don't actually store something in Session State, you will get a new session on every request..
使用基于 cookie 的会话状态时,ASP.NET 在使用 Session 对象之前不会为会话数据分配存储空间。因此,在访问会话对象之前,会为每个页面请求生成一个新的会话 ID。如果您的应用程序需要整个会话的静态会话 ID,您可以在应用程序的 Global.asax 文件中实现 Session_Start 方法并将数据存储在 Session 对象中以修复会话 ID,或者您可以在您的另一部分中使用代码应用程序将数据显式存储在 Session 对象中。
所以重申一下,要消除对Session_Start
的调用,您需要在重定向之前将某些内容置于会话状态。
Session["TheKey"] = "TheValue";
return RedirectToAction("TheAction");
【讨论】:
我添加了调用 RedirectToAction 方法的代码。你可以看到我在 RedirectToAction 方法之前填充 Session 变量,但是当 RedirectToaction 被调用时,它调用 Session_Start 并且之前设置的所有会话值都被清除。以上是关于MVC RedirectToAction 在 global.asax 中调用 Session_Start()的主要内容,如果未能解决你的问题,请参考以下文章
传递参数的mvc RedirectToAction [重复]
如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?
关于 ASP.NET MVC 中的 RedirectToAction()
RedirectToAction 不适用于 Tempdata - ASP.net 核心 MVC