RedirectToAction后,Asp MVC会话丢失

时间:2015-04-03 10:01:26

标签: c# asp.net asp.net-mvc-4 session

我有一个MVC4 Web应用程序,当我在Visual Studio中运行它时,它在我的本地机器上运行得很好。

因此,我将网站发布到服务器以使用我的应用程序。 但是当我尝试登录我的应用程序时,请转到以下代码:

[HttpPost]
public ActionResult CheckLogin(LoginViewModel vm)
{
     if (!String.IsNullOrWhiteSpace(vm.UserName) && !String.IsNullOrWhiteSpace(vm.Password))
     {
           User u = ... 
           // Get user from database with credentials

           System.Web.HttpContext.Current.Session.Add("UserIdSession", u.Id);
           return RedirectToAction("Validate", "Overview");
     }
     else
     {
         // process the error that the login failed
     }
}

重定向转到以下操作:

    [HttpGet]
    public ActionResult Validate()
    {
        if (HttpContext.Current.Session["UserIdSession"] != null)
        {
            return View();
        }
        else
        {
             return RedirectToAction("Index", "Login");
        }
    }

但问题是会话变量不存在 它总是把我送回登录屏幕

我发现在设置会话后进行重定向会导致此行为,但我无法找到解决此问题的答案...

所以我对此有一些疑问:

  1. 为什么它可以在我的本地计算机上运行而不在服务器上运行?
  2. 我可以将服务器设置修改为以我想要的方式工作吗?重定向后它会回收东西吗?
  3. 我可以在本地计算机上重现此行为,就像在服务器上使用某些设置一样吗?
  4. 必须有一个简单的方法来解决这个问题,或者我错了吗?我真的需要将会话变量存储在数据库或类似的东西中吗?

1 个答案:

答案 0 :(得分:1)

您是否拥有负载均衡的群集服务器,如果是,那么您可能希望在其上启用粘性会话,以便来自一个会话的所有请求都转到同一服务器。

如果您有服务器群集 答案:

1)当您将会话存储在memeory中时,您希望确保所有请求都发送到同一服务器,否则您将在服务器上收到此错误,但不是本地错误。

2)如果您只是在服务器上启用粘性会话,则此错误可能会消失。

3)如果错误是由于群集造成的,那么就无法在本地重现错误。

4)如果无法在loadbalancer上启用粘性会话,则可能必须将会话存储到所有群集服务器都可访问的文件中,或将其存储在db中。