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

如何在 ASP.NET MVC 中 RedirectToAction 而不会丢失请求数据

在 ASP.NET MVC 3 中调用 RedirectToAction() 后会话状态被删除