Session
摘录于 http://www.cnblogs.com/fish-li/archive/2011/07/31/2123191.html
1.默认的情况下,Session是打开的
2.可以在web.config关闭整个站点里Session:<sessionState mode="Off"></sessionState>
3.也可以在页面级上关闭Session,在每个aspx页的Page指令行, 只要我们设置一下EnableSessionState即可,这个属性有3个可选项。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" EnableSessionState="True" Inherits="_Default" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" EnableSessionState="ReadOnly" Inherits="Default2" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" EnableSessionState="False" Inherits="Default3" %>
通过反射,可以发现Page指令中的设置被编译器转成一些接口【IReadOnlySessionState,IRequiresSessionState】,即页面类继承了该接口,且这两个接口都是空接口,仅仅是为了区分使用Session的方式而已
4.微软在Session中,使用了锁定的设计,虽然会影响并发,但是,设计本身是安全的、周密的。 因为确实有可能存在一个用户的多个请求中会有修改与读取的冲突操作。但现实中,这种冲突的可能性应该是很小的,或者是我们能控制的
5.Session缺点
a. 当mode="InProc"时,也就是默认设置时,容易丢失数据,因为网站会因为各种原因重启。
b. 当mode="InProc"时,Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内存压力会比较大。
c. 当mode="InProc"时,程序的扩展性会受到影响,原因很简单:服务器的内存不能在多台服务器间共享。
d. 虽然Session可以支持扩展性,也就是设置mode="SQLServer"或者mode="StateServer",但这种方式下,还是有缺点:在每次请求时,也不管你用不用会话数据,都为你准备好,这其实是浪费资源的。
e. 如果你没有关闭Session,SessionStateModule就一直在工作中,尤其是全采用默认设置时,会对每个请求执行一系列的调用。浪费资源。
f. 并发问题
6.Session的替代方法
a. 如果需要在一个页面的前后调用过程中维持一些简单的数据,可以使用<input type="hidden" />元素来保存这些数据。
b. 您希望在整个网站都能共享一些会话数据,就像mode="InProc"那样。此时,我们可以使用Cookie与Cache相结合做法, 自行控制会话数据的保存与加载。具体做法也简单:为请求分配置一个Key(有就忽略),然后用这个Key去访问Cache, 以完成保存与加载的逻辑。如果要使用的会话数据数量不止一个,可以自定义一个类型或者使用一个诸如Dictionary, HashTable 这样的集合来保存它们。基本上这种方式就是与mode="InProc"差不多了。只是没有锁定问题,因此也就没有并发问题。
c. 如果您想实现mode="StateServer"类似的效果,那么可以考虑使用memcached这类技术,或者自己写个简单的服务, 在内部使用一个或者多个Dictionary, HashTable来保存数据即可。这样我们可以更精确的控制读写时机。 这种方法也需要使用Cookie保存会话ID。
d. 如果您想实现mode="SQLServer"类似的效果,那么可以考虑使用mongodb这类技术,同样我们可以更精确的控制读写时机。 这种方法也需要使用Cookie保存会话ID。
//从前面三种替代方法来看,如果不使用Session,那么Cookie就是必需的。其实Cookie本身就是设计用来维持会话状态的。 只是它不适合保存过大的数据而已,因此,用它保存会话ID这样的数据,可以说是很恰当的。事实上,Session就是这样做的。
//为了保持网站程序有较好的扩展性,且不需要保存过大的会话数据,那么,直接使用Cookie将是最好的选择。由于Cookie保存在浏览器,且不安全,所以建议只保存诸如:id, key 之类的简单数据,需要其它的会话数据时再根据这些id, Key去获取。