繁体   English   中英

我应该使用会议吗?

[英]Should I use sessions?

我正在设计一个供内部使用的在线时间跟踪软件。 尽管我有丰富的PHP经验,但我对c#和.NET还是比较陌生。

我正在使用Windows窗体身份验证,一旦用户使用Windows身份验证登录,便会创建一个时间表对象(我自己的自定义类)。

作为此类的一部分,我有一个构造函数,该构造函数检查SQL DB的信息(该用户的最新条目,用户首选项等)。

我应该在会话中存储此信息吗? 然后首先在构造函数中检查会话对象? 这似乎是显而易见的方法,但是我看过的大多数示例都没有太多使用会话。 有我不知道其他人会做的事情(当然与.NET会话有关)吗?

编辑:我忘了提到两件事。
1.我的SQL DB在另一台服务器上(尽管我相信它们都在同一网络上,所以没有太大的问题)
2.有些常量用户将无法更改(只有管理员可以修改它们),例如项目任务。 这些用于每个页面,但是是第一次从数据库加载。 我应该将它们存储在会话中吗? 如果没有,还有什么地方?
我能想到的唯一另一种方法是本地平面文件,该文件在项目表每次更新时都会更新,但这似乎是一个hack解决方案。 我是否在尽力减少对数据库的调用?

此处对ASP.NET会话有一个很好的概述: ASP.NET会话状态

如果您没有成千上万的客户端,但需要在服务器端存储“某种状态”,则此方法非常易于使用且效果很好。 它也可以在多服务器方案中存储在数据库中,而无需通过配置更改代码中的任何一行。

我的建议是不要在其中存储“大”或完整的对象层次结构,因为在会话中进行存储(例如,如果会话在数据库中的Web场中的服务器之间共享)可能会比较昂贵。 如果您计划仅拥有一台服务器,这并不是真正的问题,但是您必须知道,您将无法轻松地迁移到多服务器模式。

最糟糕的事情是跟随那些只说“会话不好,糟糕!”的家伙,不要使用它,最终重写自己的系统。 如果需要,请使用它:-)

我会回避会话对象。 实际上,我也想说一下.net MVC。

我不使用会话的原因是因为我认为它可能对某些开发人员来说是一个拐杖。

我会将您将放入会话的所有信息保存到数据库中。 这将允许更好的指标跟踪,对Azure的支持(不在主题范围内,但值得一提),并且更干净。

ASP开发人员知道会话状态是一项很棒的功能,但是这一功能有些局限。 这些限制包括:

ASP会话状态存在于承载ASP的过程中; 因此,影响流程的操作也会影响会话状态。 当进程被回收或失败时,会话状态将丢失。 服务器场限制。 当用户在Web服务器场中的服务器之间移动时,他们的会话状态不会跟随他们。 ASP会话状态是特定于计算机的。 每个ASP服务器都提供自己的会话状态,除非用户返回到同一台服务器,否则无法访问该会话状态。
http://msdn.microsoft.com/en-us/library/ms972429.aspx

查看HttpContext.User (IPrincipal)属性。 这是用户信息存储在请求中的位置。

Session的主要问题之一是默认情况下将其存储在内存中。 如果您有许多并发用户在会话中存储数据,这很容易导致性能问题。

另一件事是,应用程序回收将清空您的内存会话,这可能会导致错误。

当然,您可以将会话移至SqlServer或StateServer,但那样会降低性能。

大多数人之所以避免会话状态,仅仅是因为人们通常喜欢避免状态。 如果您找到了一个始终可以工作的算法或过程,而不管对象的先前状态如何,那么该过程将更容易证明将来是否需要维护,并且更易于测试。

我想说,对于这种特殊情况,将您的值存储在数据库中,并在需要该信息时从那里读取它们。 工作完成后,请查看网站的性能。 如果它运行良好,则不要理会它(因为这是最简单的编程方法)。 如果性能是一个问题,请考虑使用IIS缓存(而不是会话)或实现类似CQRS的系统。

会话状态劣势

会话状态变量会保留在内存中,直到被删除或替换,因此可能降低服务器性能。 包含信息块(例如大型数据集)的会话状态变量会随着服务器负载的增加而对Web服务器性能产生不利影响。 想想如果您同时在线有大量用户,将会发生什么情况。

注意:-我没有提到这些优点,因为它们很简单,即:简单的实现,特定于会话的事件,数据持久性,无Cookie支持等。

会话的核心问题是可伸缩性。 如果您的应用程序很小,用户数量很少,只能在一个服务器上使用,那么这可能是保存少量数据(也许只是用户ID)以允许快速访问的好方法。偏好等

如果您可能需要多个Web服务器,或者应用程序可能会增长,则不要使用会话。 并且仅将其用于少量信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM