MVC RedirectToAction在global.asax

时间:2016-02-06 10:37:01

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

我正在调用RedirectToAction方法从另一个控制器调用action方法,但它会清除所有会话数据 我在global.asax中调试并发现当我调用RedirectToAction时它会调用Session_Start()方法。 我不知道如何调用会话开始。 这是我的表单和会话标记的Web配置代码

用于会话代码

<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>

这&#34;〜/ ControllerName / ActionName&#34;与我打电话的方式相同&#34; RedirecToAction&#34;

仅供参考我正在尝试的是如果我为用户找到了cookie,他将直接从登录页面重定向到主页

两种动作方法都在不同的控制器和不同的区域。 这是使用&#34; RedirecToAction&#34;的代码。方法

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();
}}

2 个答案:

答案 0 :(得分:2)

好的,我得到了解决这个问题的方法。 我在说这个

Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

从我的方法初始化会话之前。 在我的IIS中,此键“ASP.NET_SessionId”用于在cookie中存储会话。 当它被清除时,它重新初始化我重定向到新页面。

答案 1 :(得分:1)

表单身份验证和会话状态是两个不同且无关的事物。

虽然您还没有显示调用RedirectToAction的方法,但我怀疑您事先没有将任何内容存储在会话状态中。 If you don't actually store something in Session State, you will get a new session on every request.

  

使用基于cookie的会话状态时,在使用Session对象之前,ASP.NET不会为会话数据分配存储空间。结果,为每个页面请求生成新的会话ID,直到访问会话对象。如果您的应用程序需要整个会话的静态会话ID,您可以在应用程序的Global.asax文件中实现Session_Start方法,并将数据存储在Session对象中以修复会话ID,或者您可以使用代码应用程序的另一部分,用于在Session对象中显式存储数据。

重申一下,要消除对Session_Start的调用,您需要在重定向之前将某些内容置于会话状态。

Session["TheKey"] = "TheValue";
return RedirectToAction("TheAction");