Mic*_*cah 21 asp.net iis session session-state
我已经对这个主题进行了搜索,并且一遍又一遍地找到了相同的数据 - 对三种不同类型会话的回顾.(InProc,Sql,StateServer)但是,我的问题是不同的.
具体来说,首先使用内置.NET会话的优点/缺点是什么?
这就是我要问的原因:一位.NET开发人员告诉我永远不要使用内置的Microsoft Session.一点也不.甚至没有创建自定义会话状态提供程序.他的理由如下:如果您在IIS中打开了会话,它会使您的所有请求同步发生.他说,启用会话会降低Web服务器的性能.
他的解决方案是自己创建一个会话 - 一个存储所需值的类,并在数据库中进行序列化.他建议您存储唯一ID以在cookie或querystring变量中引用它.在我们的环境中,使用数据库存储会话是一项要求,因为我们制作的所有页面都在Web场上,我们使用Oracle--所以我同意这一部分.
使用内置Session会降低性能,而不是自制的Session吗?这有什么安全问题吗?
总而言之,有什么优点/缺点?
感谢所有回答的人!
Aar*_*els 17
我的经验是,当您正确使用会话时,会话是管理状态的好方法.但是,它经常被滥用,导致许多开发人员共享的"永远不会使用会话"的情绪.
当我们错误地使用会话来存储来自数据库的大量数据时,我和许多其他开发人员遇到了主要的性能问题,以便"节省旅行".这是不好的.当多个用户使用该应用程序时,每个会话存储2000个用户记录将使Web服务器瘫痪.Session不应该用作数据库缓存.
但是,每个会话存储一个整数是完全可以接受的.表示当前用户如何使用您的应用程序(想想购物车)的少量数据可以很好地利用会话状态.
对我来说,这完全是关于管理国家的.如果正确完成,那么会话可以是管理状态的许多好方法之一.应该在一开始就决定如何管理国家.大多数情况下,当有人决定"在会话中扔东西"时,我们遇到了麻烦.
我发现这篇文章在使用进程外模式时非常有用,它包含了一些我自己从未想过的技巧.例如,不是将类标记为可序列化,而是将其原始数据类型成员存储在单独的会话变量中,然后重新创建对象可以提高性能.
首先,你的同事正在实现他自己的数据库支持的会话管理系统,我没有看到它比使用存储在数据库中的内置会话状态有什么优势(MS SQL是默认的,没有理由不使用Oracle代替).
他的解决方案比内置解决方案更好吗?不太可能.这对你来说更有意义.这是一个简单的说明原因.假设您使用cookie来存储您的ID,您如何应对关闭Cookie的用户?如果您正在使用ASP.Net的会话状态,则没有问题,因为它将回退到使用查询字符串.有了同事的想法,你必须自己动手.
还有就是,你是否有shold会话状态都非常有效的问题.如果您可以设计您的应用程序根本不需要任何会话状态,那么您将可以更轻松地进行扩展和测试.显然,您可能拥有需要在会话之外生活的应用程序状态(简单的情况是beign用户名和密码),但无论您是否具有会话状态,您都必须存储这些数据.
会话状态的MS实现本身并不邪恶......这是一些开发人员使用它的方式.如上所述,使用内置会话状态提供程序意味着您不必重新发生安全性,老化和并发问题.只是不要在会话中开始干扰大量垃圾,因为你太懒了,无法找到更好的方法来管理状态和页面转换.会话不能很好地扩展...如果你的站点上的每个用户在会话中填充了一堆对象,并且这些对象占用了应用程序可用的有限内存的一小部分,那么你会遇到问题.稍后您的应用程序越来越受欢迎.以设计方式使用会话:表示用户仍在"使用"您网站的令牌.当你开始冒险,无论是因为无知还是懒惰,你一定会被烧伤.
您在使用Session时应该明智,因为对同一个Session对象的多个请求通常会排队:请参阅"并发请求和会话状态" http://msdn.microsoft.com/en-us/library/ms178581.aspx.
请注意,您可以设置EnableSessionState为ReadOnly允许对会话状态进行并发读取访问.
这种排队是一件好事,因为这意味着开发人员可以在不关心同步的情况下使用Session.
我不同意你同事的"从不"使用Session的建议,我当然不会考虑自己动手.
首先,浏览器只会在给定时间向给定的主机名发出两个请求.在大多数情况下,这些请求是针对静态内容(JS文件,CSS等).因此,对动态内容的请求的序列化几乎不是人们可能认为的问题.另外,我认为这可能与Classic ASP相混淆,其中使用Session的页面肯定是序列化的,我不相信ASP.Net就是这种情况.
使用ASP.Net会话状态(SQL模式,状态服务器或自定义),您可以获得标准的实现,并在整个应用程序中保持一致.如果您不需要分享会话信息,这是您最好的选择.如果您需要与其他应用程序环境(php,swing/java,经典asp等)共享信息,可能值得考虑.
另一个优点/缺点是,有很多开发人员专注于关于性能的会话的内置方法,以及自己设计的设计,即使是使用不同的提供商.