【发布时间】:2010-07-06 07:58:56
【问题描述】:
我有一个 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 变量中获取它,但我不确定它是否从未使用过(或使用 every get!? ) 或什么。
我最近的想法是使用我的页面类。我有一个从标准 System.Web.UI.Page 基类派生的自定义页面类。它包括像 CurrentUser 这样的对象作为公共属性。这似乎工作正常。我更喜欢它。
但我真的不知道幕后发生了什么。任何人都可以就哪种方法更好以及为什么提出意见?
也欢迎对此提出其他建议。
更新: 我已经对使用 trace.axd 和 Trace.Write 进行了一些检查,它看起来既不是母版页版本,也不是自定义页面类版本“记住”页面之间的值。 “get”方法有一行代码检查 User 属性是否为空,如果是,则从会话变量中读取它。当页面在给定页面上第一次访问属性(Master.User 或派生类的 this.User)时会发生这种情况,然后后续请求可以获取该值(无需转到会话变量)。
【问题讨论】:
-
仅供参考,性能应该在您的关注列表中较低。从 Session 中拉出对象的开销极低。易用性和封装性很重要,优化不重要。
标签: asp.net master-pages session-state derived-class