何时该对象将被垃圾收集或销毁。
会话到期时。会话状态在您的 web.config 中使用<sessionState>
节点进行配置。你可以看看following overview
关于会话。默认情况下,ASP.NET 将会话数据存储在内存中。这意味着如果您的应用程序在网络场中运行,您将遇到问题,因为该网络场的不同节点可能看不到存储在其他节点上的值。如果要在这种情况下使用会话,则必须配置进程外会话状态,例如StateServer
或SqlServer
。默认会话状态模式的另一个问题InProc
是,如果 IIS 决定回收您的应用程序,您可能会丢失存储在其中的数据。还有一个根本不使用会话或使用进程外会话存储的原因。
因此,例如,您可以为会话指定超时,如下所示:
<sessionState mode="InProc" timeout="20" />
默认值为 20 分钟。但是,这将再次取决于您使用的模式。
我知道在另一种脚本语言(如 PHP)中,我必须在需要使用这种类似会话对象数据的所有文件中调用 session_start() 和 session_end()。
无需担心 ASP.NET MVC 中的此类事情。
现在说了这么多,我建议你根本不要使用任何会话。ASP.NET 已经为您提供了跟踪经过身份验证的用户的必要机制。您可以使用Forms Authentication
专为安全跟踪经过身份验证的用户而设计的。
因此,首先关闭 ASP.NET 会话:
<sessionState mode="Off" />
进而:
[Anonymous]
public ActionResult Login(LoginModel model)
{
// TODO: check credentials, ...
FormsAuthentication.SetAuthCookie(model.Username, false);
//something else
// finally redirect and inside the target controller action
// you will be able to retrieve the authenticated user
return RedirectToAction("SomeProtectedAction");
}
然后您可以装饰受保护的控制器操作,这些操作只能由具有该[Authorize]
属性的经过身份验证的用户访问,并在其中检索当前经过身份验证的用户:
[Authorize]
public ActionResult SomeProtectedAction()
{
string username = User.Identity.Name;
// something else ...
}