ASP.NET Masters:使用Session变量有哪些优点/缺点?

时间:2009-04-28 18:06:17

标签: asp.net session iis session-state

我已经对这个主题进行了搜索,并且一遍又一遍地找到了相同的数据 - 对三种不同类型会话的回顾。 (InProc,Sql,StateServer)但是,我的问题是不同的。

具体来说,首先使用内置.NET会话的优点/缺点是什么?

这就是我要问的原因:一位.NET开发人员告诉我永远不要使用内置的Microsoft Session。一点也不。甚至没有创建自定义会话状态提供程序。他的理由如下:如果您在IIS中打开了会话,它会使您的所有请求同步发生。他说,启用会话会降低Web服务器的性能。

他的解决方案是自己创建一个会话 - 一个存储所需值的类,并在数据库中进行序列化。他建议您存储唯一ID以在cookie或querystring变量中引用它。在我们的环境中,使用数据库存储会话是一项要求,因为我们制作的所有页面都在Web场中,我们使用Oracle--所以我同意这一部分。

使用内置会话是否会降低性能而不是自制的会话?这有安全问题吗?

总而言之,有什么优点/缺点?

感谢所有回答的人!

8 个答案:

答案 0 :(得分:17)

我的经验是,当您正确使用会话时,会话是管理状态的好方法。但是,它经常被滥用,导致许多开发人员共享的“永远不会使用会话”的情绪。

当我们错误地使用会话来存储来自数据库的大量数据时,我和许多其他开发人员遇到了重大的性能问题,以便“节省旅行”。这是不好的。当多个用户使用该应用程序时,每个会话存储2000个用户记录将使Web服务器瘫痪。会话不应该用作数据库缓存。

然而,每个会话存储一个整数是完全可以接受的。表示当前用户如何使用您的应用程序(想想购物车)的少量数据可以很好地利用会话状态。

对我来说,这完全是关于管理国家的。如果正确完成,那么会话可以是管理状态的许多好方法之一。应该在开头决定如何管理状态。大多数情况下,当有人决定“在会话中扔东西”时,我们遇到了麻烦。

我发现this文章在使用进程外模式时非常有用,它包含了一些我自己从未想过的提示。例如,不是将类标记为可序列化,而是将其原始数据类型成员存储在单独的会话变量中,然后重新创建对象可以提高性能。

答案 1 :(得分:7)

首先,你的同事正在实现他自己的数据库支持的会话管理系统,我没有看到它比使用存储在数据库中的内置会话状态有什么优势(MS SQL是默认的,没有理由不使用Oracle代替)。

他的解决方案比内置解决方案更好吗?不太可能。这对你来说更有意义。这是一个简单的说明原因。假设您使用cookie来存储您的ID,您如何应对关闭Cookie的用户?如果您正在使用ASP.Net的会话状态,则没有问题,因为它将回退到使用查询字符串。有了同事的想法,你必须自己动手。

是一个非常有效的问题,关于你是否完全拥有会话状态。如果您可以设计您的应用程序根本不需要任何会话状态,那么您将可以更轻松地进行扩展和测试。显然,你可能有应用程序状态,无论如何都需要在会话之外生存(简单的情况是beign用户名和密码),但无论你是否有会话状态,你都必须存储这些数据。

答案 2 :(得分:6)

会话状态的MS实现本身并不邪恶......这是一些开发人员使用它的方式。如上所述,使用内置会话状态提供程序意味着您不必重新发生安全性,老化和并发问题。只是不要在会话中开始干扰大量垃圾,因为你太懒了,无法找到更好的方法来管理状态和页面转换。会话不能很好地扩展...如果您站点上的每个用户在会话中填充了一堆对象,并且这些对象占用了应用程序可用的有限内存的一小部分,那么您将遇到问题早于稍后您的应用程序越来越受欢迎。以设计方式使用会话:表示用户仍在“使用”您网站的令牌。当你开始冒险,无论是因为无知还是懒惰,你一定会被烧伤。

答案 3 :(得分:6)

您在使用Session时应该明智,因为对同一个Session对象的多个请求通常会排队:请参阅“并发请求和会话状态” http://msdn.microsoft.com/en-us/library/ms178581.aspx

请注意,您可以将EnableSessionState设置为ReadOnly以允许对会话状态进行并发读取访问。

这种排队是一件好事,因为这意味着开发人员可以在不关心同步的情况下使用Session。

我不同意你同事的“从不”使用Session的建议,我当然不会考虑自己动手。

答案 4 :(得分:5)

首先,浏览器只会在给定时间向给定的主机名发出两个请求。在大多数情况下,这些请求是针对静态内容(JS文件,CSS等)。因此,对动态内容的请求的序列化几乎不是人们可能认为的问题。另外,我认为这可能与Classic ASP相混淆,其中使用Session的页面肯定是序列化的,我不相信ASP.Net就是这种情况。

使用ASP.Net会话状态(SQL模式,状态服务器或自定义),您可以获得标准的实现,并在整个应用程序中保持一致。如果您不需要分享会话信息,这是您最好的选择。如果您需要与其他应用程序环境(php,swing / java,经典asp等)共享信息,可能值得考虑。

另一个优点/缺点是,很多开发人员都专注于关于性能的会话的内置方法,以及自己设计的设计,即使是使用不同的提供商。

答案 5 :(得分:3)

  

这有什么安全问题吗?

如果你自己动手,你将不得不处理会话修复和劫持攻击,而使用内置的Session I 认为它们是为你处理的(但我可能是错的)。< / p>

答案 6 :(得分:3)

如你所描述的那样,自制会话正在做什么不同的.Net会话的“SQL”状态,根据我的经验,我认为会话无论如何都不会降低你的性能。建立自己的会话管理器将需要输入其他几个管道任务 - 安全性,清除它们等等。

内置会话的优点是易于使用,所有这些管道已经得到了解决。使用“SQL”模式,您可以将会话数据保存在数据库中,从而允许您在Web场上运行您的应用程序而不会出现任何问题。

我们为财富57公司设计了一个b2b电子商务应用程序,该公司每天处理超过10万笔交易,并且使用会话[SQL模式],而且没有任何问题。

答案 7 :(得分:2)

如果我错了,请纠正我:

在数据库(例如SQL Server)中存储会话状态的主要优点是您不会占用内存资源,而是将其存储到数据库中的磁盘上。

缺点是您每次需要时都会使用IO命中从数据库中检索此信息(或者SQL Sever甚至可以根据最近执行的查询为您执行一些神奇的数据缓存?)

无论如何,从每次旅行到网络服务器的数据库中检索会话信息的IO的价格对于遇到大量流量的网站来说似乎是一种更安全的策略。