我的Session对象什么时候会死?

时间:2013-02-17 16:27:57

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

我是一名asp.net新手学习MVC 4(4.5)。我运行以下代码,以便在发布登录信息时将登录用户名存储在会话中

[Anonymous]
public ActionResult Login(LoginModel model)
{
    Session["Username"]=model.Username;
    ///something else
} 

在某个地方的另一个文件中,我可以使用Session["Username"]。好吧,我对当前混乱的问题就是什么时候这个对象会被垃圾收集或销毁。

我知道像PHP这样的另一种脚本语言,我必须打电话 需要使用此类似会话对象数据的所有文件中的session_start()session_end()。我在新创建的MVC 4项目中找不到相同的东西,但认证机制似乎都在我身上完成。

2 个答案:

答案 0 :(得分:1)

  

此对象将被垃圾收集或销毁。

会话到期时。使用<sessionState>节点在web.config中配置会话状态。您可以查看有关会话的following overview。默认情况下,ASP.NET将会话数据存储在内存中。这意味着如果您的应用程序在Web场中运行,您将遇到问题,因为此Webfarm的不同节点可能看不到存储在某个其他节点上的值。如果要在此类方案中使用会话,则必须配置进程外会话状态,例如StateServerSqlServer。默认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 ...
}

答案 1 :(得分:0)

看看Global.asax

在那里你有各种活动,从应用程序启动到会话,到请求开始/结束等等......

但请注意,&#39;结束&#39;不保证可以调用方法。所以不要指望他们。

如果您决定使用会话,请不要像在示例中那样使用字符串。为您的会话创建一个具有适当属性的类,并使用SessionManager来处理它。从长远来看,它会对你有很大帮助。