为什么我丢失会话变量?

时间:2014-07-02 14:53:23

标签: asp.net-mvc asp.net-mvc-4 knockout.js session-variables

我在MVC并使用KnockoputJS。我从2选择中选择值。在第一个选择中我选择IDCompany,第二个选择我选择IDSubsidiary。

我将Json中的模型发送到控制器中的JsonResult,我创建了一个变量会话和一个cookie,并将IDCompany保存在Session变量和同名的cookie中。

我对IDSubsidiary做同样的事情。最后,我返回到ajax函数(最初调用“Save”)

[HttpPost]
public JsonResult Save(ViewModel viewModel)
{
  Session["IDCompany"] = viewModel.IDCompany.ToString();
  Response.Cookies["IDCompany"].Value = viewModel.IDCompany.ToString();
  Response.Cookies["IDCompany"].Expires = DateTime.Now.AddDays(1);

  Session["IDSubsidiary"] = viewModel.IDSubsidiary.ToString();
  Response.Cookies["IDSubsidiary"].Value = viewModel.IDSubsidiary.ToString();
  Response.Cookies["IDSubsidiary"].Expires = DateTime.Now.AddDays(1);

  return Json(true);
}

问题是,过了一会儿(约30分钟),我失去了Session["IDCompany"]Session["IDSubsidiary"](变为空)。 问题可能是,例如,Session [“IDSubsidiary”]和Response.Cookies["IDSubsidiary"]具有相同的名称?

1 个答案:

答案 0 :(得分:3)

这可能有两个原因。 1)会话超时,或者2)你正在使用" In Process"会话状态。

如果用户在页面上停留了30分钟,然后在下次刷新或转到另一个页面时该值消失,则可能是超时问题。您可以尝试增加sessionState超时;但是,您可能会开始遇到下面描述的问题。如果您决定使用会话变量,您可能应该切换到与过程中的"不同的状态模式。这是默认值。

如果没有超时,你的价值丢失的原因是因为" In Process"会话状态,当App Pool回收时消失。这可能由于各种原因而发生。您可能希望将会话状态模式更改为State Server或SQL Server。这将使您的会话数据保持在应用程序池回收之间,但您需要启用" ASP.NET会话状态服务"如果您使用State Server路由,请在Web服务器上。

有几种状态模式,每种都有不同的行为。你可以阅读它们here on MSDN.