【问题标题】:Asp MVC, is session lost upon building solution?Asp MVC,构建解决方案时会话是否丢失?
【发布时间】:2009-11-10 23:21:46
【问题描述】:

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

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

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

所以基本上对于控制器中的每一个微小变化,我都必须注销,登录才能看到我的变化。

这些是正常行为吗?

【问题讨论】:

    标签: asp.net-mvc session


    【解决方案1】:

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

    【讨论】:

    • 是的,我会这样做。但是在每个页面上查询数据库以获取用户详细信息不是数据库密集型的吗?
    • 这就是您首先检查会话的原因。如果 Session 为空,您只会查询数据库。
    【解决方案2】:

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

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

    善良,

    【讨论】:

    • 那么如何调试大型项目呢?您是否总是注销、登录以查看更改?我们可以将用户详细信息保存在其他地方吗?例如 Request.IsAuthenticated 是真的,除了会话丢失的事实。我可以在那里保存一些凭据吗?
    • @gong 看看我下面的回复以处理信息。
    【解决方案3】:

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

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

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

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

    将类似的东西添加到基本控制器或扩展方法中

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 2011-12-24
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多