我应该使用会话吗?

时间:2011-12-28 13:52:58

标签: c# .net session

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

我正在使用Windows窗体身份验证,一旦用户使用它登录,我就创建了一个Timesheet对象(我自己的自定义类)。

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

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

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

8 个答案:

答案 0 :(得分:3)

这里有一个关于ASP.NET Session的概述:ASP.NET Session State

如果您没有数千个客户端,但需要存储服务器端的“某些状态”,这很容易使用并且运行良好。它也可以存储在多服务器方案的数据库中,而无需通过配置更改代码中的一行。

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

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

答案 1 :(得分:1)

我会回避会话对象。实际上,我会说看看.net MVC。

我不使用会话的原因是因为我觉得这对某些开发人员来说可能是个问题。

我会将您放入会话的所有信息保存到数据库中。这将允许更好的指标跟踪,支持Azure(非主题,但值得一提),并且是更清洁的imo。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

当然,您可以将会话移动到SqlServer或StateServer,但之后您将失去性能。

答案 5 :(得分:0)

大多数人避免会话状态只是因为人们总喜欢避免状态。如果您可以找到一个始终有效的算法或过程,而不管对象的先前状态如何,那么该过程往往更加简单,以防止将来的维护,并且更容易测试。

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

答案 6 :(得分:0)

会话状态不利

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

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

答案 7 :(得分:0)

会话的核心问题是可扩展性。如果您的应用程序很少,用户数量很少,只能在一台服务器上运行,那么这可能是您保存少量数据(可能只是用户ID)的好途径,以便快速访问偏好等。

如果您可能需要多个Web服务器,或者应用程序可能会增长,那么请不要使用会话。并且仅用于小部分信息。