C# 会话正在控制器上重定向到操作时重置

C# 会话正在控制器上重定向到操作时重置,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个loginController,索引方法为 public ActionResult Index(string something) { Session.Abandon(); Session["ActiveUser"] = _user; return RedirectToAction("All", "User"); } 和UserContoller作为 public ActionResult All() { var _curre

我有一个loginController,索引方法为

public ActionResult Index(string something)
{
    Session.Abandon();
    Session["ActiveUser"] = _user;
    return RedirectToAction("All", "User");
}
和UserContoller作为

     public ActionResult All()
     {
        var _currentUser = ((AuthUser)Session["ActiveUser"]);
     }
问题是,当重定向发生时,会话状态重置,我无法理解为什么? 任何帮助或资源都将不胜感激。

Edit
我还写了Session.about();在一开始,当我从我的代码中删除它时,它开始工作得很好

是的,那就可以解释了。调用
Session.about
将会话排入销毁/删除队列,并在初始请求(重定向开始之前)完成处理时执行该会话。因此,在该初始请求中对会话(包括TempData)所做的任何操作基本上都会被忽略,因为整个会话(包括更改)都会被丢弃

调用放弃方法时,当前会话对象将排队等待删除,但在处理当前页面上的所有脚本命令之前,不会实际删除该对象。这意味着您可以访问会话对象中存储的变量,该变量与对放弃方法的调用位于同一页面上,但不能访问任何后续网页中的变量



webconfig@Igor中没有特殊的会话配置

然后,会话状态未启用,这就是您无法从
会话
临时数据
检索任何内容的原因。您需要在web.config中配置会话状态。如果您仅对TempData使用此选项,则可以将其配置为
InProc
。如果您想要配置长期存储(跨多个请求提供数据),并且您有多个服务器(即web场)可以处理请求,您应该使用类似Sql Server的存储来查看配置

您可以直接在
web.config
()


或者使用IIS(请参见下面的屏幕截图)


为什么同时使用会话和临时数据?为什么不只使用TempData呢?我正在使用它们,但它们都不起作用,我也尝试过单独使用它们,它可能是清理@IgorOk后留下的。TempData还使用隐蔽的会话存储,它更像是一个MVC结构,而不是会话,如果您只在请求中持久化状态(在本例中使用重定向),那么最好只使用该状态而不是会话。您如何在web.config中配置会话存储(您也可以在IIS中看到配置)?webconfig@Igorif中没有会话的特殊配置。如果您从TempData获取数据,然后重定向,那么TempData中的数据将变为null。好的,我将尝试使用它,但在此之前只有一个疑问,我有相同的网络配置(没有任何特定设置和[HttpPost]索引(LoggedUser))我无法理解这种行为。我的IIS设置与您在屏幕快照中定义的相同。这可能是因为我正在运行两个localhost:x和localhost:y,其中y从x接收一些调用,然后x使用一些命令重定向它token@Vikas-如果有多台主机相互通信,则它们很可能无法共享会话状态。在这种情况下,这将是根本问题。如果它们是运行同一web应用程序的多台服务器(如web场场景)然后,您可以将两台服务器配置为使用Sql Server之类的中央存储,然后它们都可以访问会话状态。我还编写了Session.about();在开始时,当我从代码中删除Session.about()时,它开始正常工作,有什么想法@igor吗
<sessionState mode="Off|InProc|StateServer|SQLServer"
          cookieless="true|false"
          timeout="number of minutes"
          stateConnectionString="tcpip=server:port"
          sqlConnectionString="sql connection string"
          stateNetworkTimeout="number of seconds"/>