我有一个 ASP.NET 应用程序,它需要在会话中跨页面记住有关用户(以及他们来自哪个公司)的一些信息。
我想这几乎是任何特定大小的 ASP.NET 应用程序的要求。这些年来,我使用了几种不同的方法。
过去,我在查询字符串参数中传递了一个 id,如下所示:
site.com/page.aspx?usrid=1&companyid=2
然后实例化每个页面上的对象(来自数据库)。
另一种常见的方法是将我的对象存储在会话变量中:
Session["User"] = currentUser; // store at login
User currentUser = (User)Session["User"]; // retrieve on some other page
这样可以节省前往数据库的行程,但是如果用户对象很复杂并且站点有很多并发用户,我会担心使用的内存。
我最近继承了一个使用母版页上公共属性的应用程序,如下所示:
Master.theUser = currentUser; // store at login
User currentUser = Master.theUser; // retrieve on some other page
这样可以节省演员表,并且我认为对我来说看起来更具可读性,但我不知道它在性能方面是更好还是更差。它在 getter 中也有一些逻辑,如果私有值为 null,它会尝试从 Session 变量中获取它,尽管我不确定是否从未使用过(或每次获取都使用过!?)或什么。
我最新的想法是使用我的页面类。我有一个从标准 System.Web.UI.Page 基类派生的自定义页面类。它包括像 CurrentUser 这样的对象作为公共属性。这似乎工作正常。我更喜欢它。
但我真的不知道幕后发生了什么。任何人都可以就哪种方法更好以及为什么提出意见?
也欢迎这样做的替代建议。
更新: 我已经对使用 trace.axd 和 Trace.Write 进行了一些检查,它看起来既不是母版页版本,也不是自定义页面类版本“记住”页面之间的值。“get”方法有一行代码检查 User 属性是否为空,如果是,则从会话变量中读取它。当页面在给定页面上第一次访问属性(Master.User 或派生类的 this.User)时会发生这种情况,然后后续请求可以获取该值(无需转到会话变量)。