Asp MVC,在构建解决方案时会丢失会话吗?

时间:2009-11-10 13:52:19

标签: asp.net-mvc session

我正在ASP.NET MVC中编写应用程序。基本上我有一些页面需要用户身份验证。在用户登录时,我将用户行保留在会话中。所以在我的控制器中,我可以访问user.ID而无需进行额外的查询。

当项目处于调试模式时,我只能更改视图中的内容。不在控制器中。

如果我没有调试,我可以构建解决方案,并在不运行项目的情况下查看我所做的更改(使用F5)。 但是,它会丢失我拥有的所有会话变量。

所以基本上对于每一个无关紧要的控制器变化,我必须注销,登录才能看到我的变化。

这些是正常行为吗?

3 个答案:

答案 0 :(得分:2)

是的,这是ASP.NET作为一个整体而不仅仅是MVC的正常行为。

如果需要重新编译(例如控制器或业务对象的更改),则在调试中运行时将进入新会话。如您所说,只有视图或页面的更改(不需要重新编译)才能让您在同一会话中看到更改。

善,

答案 1 :(得分:2)

像丹所说,这是正常的行为。为了使其更容易(并且稍微更强大),可以稍微更改代码。这当然是假设您在会话中存储的不仅仅是用户ID,因为您可以在验证时通过Controller.User.Identity.Name访问用户ID。因此,您在会话对象中执行其他数据的查找,如果它不返回null,则使用它。如果它确实返回null,则根据用户ID再次查找其他信息并再次将其存储在会话中。这是我从Active Directory存储信息的方法,它运行良好。

答案 2 :(得分:1)

重新编译将清除所有当前会话数据。但是,它不会清除您的身份验证票证,它存储为cookie,因此您可以采取一些措施来避免这种情况。

  1. 如果您只需要访问用户ID,请使用User.Indentity.Name

  2. 如果您只需要用于显示目的的基本用户数据(例如用户名),则可以将其存储在会话cookie中。 警告:除非您加密Cookie数据,否则只会显示数据,不应信任纯文本Cookie数据。

  3. 如果您的用户数据比此更复杂,则通过使用Agent_9191建议的缓存的方法访问数据

  4. 将类似内容添加到基本控制器或扩展方法

    protected UserData GetUserData() {
      UserData user = HttpContext.Session["User"] as UserData;
      if (user == null) {
        user = UserDataRepository.GetUser(User.Identity.Name);
        HttpContext.Session.Add("User", user);
      }
      return user;
    }