0

我正在编写一个 MVC 5 互联网应用程序,当用户登录时,我希望存储登录详细信息,以便我可以在任何类中检索这些详细信息。

我做了一些研究,我可以缓存数据,也可以将这些数据存储在会话中。因为数据是在用户登录时才设置的,并且只和登录的用户相关,所以我认为应该使用下面的代码:

Session[key] = data;

有什么缺点或使用上面的代码?此会话数据是否存在超时,或者它是否会持续到用户关闭浏览器和/或注销?

另一种选择是使用以下代码:

System.Web.HttpRuntime.Cache[key] = data;

使用上述代码时,我应该考虑哪些优点?我目前倾向于使用Session[key] = data,因为数据仅与登录用户相关,而不是应用程序范围。

提前致谢。

4

2 回答 2

0

会话是每个用户/会话,而缓存是每个应用程序。所以如果我理解得很好,缓存不能为你使用,不是吗?

当用户关闭会话时会话过期,或者您可以在没有登录名或用户的情况下创建会话。您在 web.config 上设置会话的最长时间。当用户关闭浏览器时会话关闭。

如果您想在浏览器关闭后也使会话可用,则必须混合使用 cookie 和会话。Cookie 存储在客户端的浏览器中,并且可以托管会话的 Id,但我不推荐它。

于 2014-12-09T13:05:14.157 回答
0

鉴于您的问题中指定的要求,我相信您最好的方法是使用会话。您所描述的正是会话最适合的内容 - 在访问期间持久保存经常访问的用户特定数据。

会话在用户关闭浏览器时或在您的应用程序指定的超时后过期。

至于使用会话对象,Session直接从控制器中引用对象,我强烈建议您使用 IoC 容器(例如 StructureMap)将会话注入依赖它们的类(例如控制器或服务)中。这使您可以针对接口而不是实现进行编程,并使代码更具可测试性和可维护性。

这是一个简短的例子,取自一篇关于这个主题的博客文章IUserInformation,其中包含用户的会话数据:

public class UserDetailController : Controller {

    private readonly IUserInformation userInformation;

    public void ExampleLoginController(IUserInformation userInformation) {
        this.userInformation = userInformation;
    }

    [HttpPost]
    public ActionResult ViewProfile()
    {
        ...
        string emailAddress = this.userInformation.EmailAddress;
        ...
    }
}
于 2014-12-10T00:16:56.363 回答