我应该使用会话吗?
本文关键字:会话 我应该 | 更新日期: 2023-09-27 18:19:00
我正在设计一个在线时间跟踪软件供内部使用。虽然我有丰富的PHP经验,但我对c#和。net还是个新手。
我使用Windows窗体身份验证,一旦用户登录使用,我创建一个时间表对象(我自己的自定义类)。
作为这个类的一部分,我有一个构造函数,用于检查SQL DB中的信息(该用户最近的条目、用户首选项等)
我应该在会话中存储这些信息吗?然后先检查构造函数中的会话对象?这似乎是一种显而易见的方法,但我所看到的大多数示例并没有充分利用会话。是否有一些我不知道而其他人知道的事情(当然是与。net会议相关的)?
编辑:我忘了提两件事。
1。我的SQL数据库在另一台服务器上(尽管我相信它们都在同一个网络上,所以没有太大的问题)
2。有一些常量是用户不能修改的(只有管理员可以修改),比如项目任务。它们在每个页面上使用,但第一次从DB加载。我应该将这些存储在会话中吗?如果不是,还有哪里?
我能想到的唯一另一种方法是在每次项目表更新时更新本地平面文件,但这似乎是一个hack的解决方案。我是不是太努力了,尽量减少对数据库的调用?
有一个关于ASP的很好的概述。. NET会话在这里:. NET会话状态。
如果你没有成千上万的客户端,但需要"一些状态"存储在服务器端,这是非常容易使用和工作良好。它也可以存储在多服务器场景下的数据库中,无需更改代码中的一行,只需通过配置。
我的建议是不要在那里存储"大"或完整的对象层次结构,因为存储在会话中(如果会话在数据库中的web农场中的服务器之间共享)可能会有些昂贵。如果您计划只使用一台服务器,这并不是一个真正的问题,但是您必须知道,您将无法轻松地切换到多服务器模式。
最糟糕的事情是跟随那些只说"session很糟糕,哇哦!"的人,不要使用它,最终重写你自己的系统。如果你需要它,使用它:-)
我会避开会话对象。实际上我还会说看看。net MVC
我不使用会话的原因是我觉得它可能成为一些开发人员的拐杖。
我将保存所有的信息,你会把一个会话到一个数据库。这将允许更好的指标跟踪,支持Azure(离题但值得一提),并且在我看来更简洁。
ASP开发人员知道会话状态是一个很好的特性,但是它有一定的局限性。这些限制包括:
ASP会话状态存在于承载ASP的进程中;因此,影响流程的操作也会影响会话状态。当进程被回收或失败时,会话状态将丢失。服务器场限制。当用户在Web服务器群中从一个服务器移动到另一个服务器时,他们的会话状态不会跟随他们。ASP会话状态是特定于机器的。每个ASP服务器都提供自己的会话状态,除非用户返回到同一服务器,否则会话状态是不可访问的。
http://msdn.microsoft.com/en-us/library/ms972429.aspx
Session的一个主要问题是,默认情况下,它存储在内存中。如果有许多并发用户在会话中存储数据,这很容易导致性能问题。
另一件事是,应用程序回收将清空您的内存会话,这可能导致错误。
当然你可以把你的会话移到SqlServer或staterver,但这样你会损失性能。
查看HttpContext。用户(IPrincipal)属性。这是请求中存储用户信息的地方。
大多数人避免会话状态只是因为人们一般喜欢避免状态。如果你能找到一种算法或过程,无论对象以前的状态如何,它都能一直工作,那么这个过程往往更容易防止将来的维护,也更容易测试。
对于这种特殊情况,我想说,将您的值存储在数据库中,并在需要该信息时从那里读取它们。一旦你的工作,看看网站的性能。如果它运行良好,那就别管它了(因为这是最简单的编程情况)。如果性能是一个问题,考虑使用IIS缓存(而不是会话)或实现像CQRS这样的系统。会话状态劣势
会话状态变量在被删除或替换之前一直保留在内存中,因此会降低服务器性能。包含信息块(如大型数据集)的会话状态变量可能会随着服务器负载的增加而对web服务器性能产生不利影响。想象一下,如果大量用户同时在线会发生什么。注意:-我没有提到的优点,因为它们是直接的,它们是:简单的实现,特定于会话的事件,数据持久性,无cookie支持等。
会话的核心问题是可扩展性。如果您有一个小型应用程序,用户数量很少,并且只在一台服务器上,那么保存少量数据(可能只是用户id)以允许快速访问首选项等可能是一个不错的方法。
如果你可能需要多个web服务器,或者应用程序可能会增长,那么不要使用session。