【问题标题】:MVC RedirectToAction calls Session_Start() in global.asaxMVC RedirectToAction 在 global.asax 中调用 Session_Start()
【发布时间】: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();
}}

【问题讨论】:

    标签: asp.net-mvc session session-cookies session-state


    【解决方案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 并且之前设置的所有会话值都被清除。
      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 2010-10-20
      • 2012-10-22
      • 2012-01-16
      • 2022-10-08
      • 2019-07-09
      • 1970-01-01
      • 2011-01-20
      相关资源
      最近更新 更多