• MongoDB实践-自定义ASP.NET Session Store


    Session由来

        由于HTTP协议是无状态的,客户端与服务器端进行“请求-响应”操作后,建立的连接就释放了,服务器端根本不知道刚才是哪个客户端访问的。但是有些场景是需要知道客户端的状态的,最典型的就是登陆问题,成功登陆后一段时间内就不需要再登陆。为了解决这个问题,服务器端引入了Session技术,它将会话状态保存在服务器端的技术。

    Session原理

        当用户打开浏览器,请求某个网站的时候,服务器接收请求后,就会在内存中为该请求分配一个内存空间,这个内存空间就叫Session。一个Session对应一个请求而且是唯一的,使用SessionId来表示唯一性。Session数据结构是一个Key-Value的集合。

    跟踪机制

    1. 当服务器端返回客户端请求时,会把SessionId作为Cookie的值发送到客户端;
    2. 当客户端再请求问服务器时,会把本地保留的SessionId的Cookie放到Http请求头中发送给服务器端;
    3. 服务器端接收到客户端请求,解析出SessionId,从而获得相应的Session。这样服务器端就知道客户端的状态了

    超时管理

        服务器端无法判断当前客户端是否还会继续访问,也无法检测客户端是否关闭,所以,即使客户离开或关闭浏览器,服务器还是会保留与之对应的Session对象。

    随着时间的不断推移,服务器将会积累大量不在使用的Session对象,并最终会导致服务器内存耗尽。所以服务器就采用了“超时限制”的办法来解决无效Session问题。如果某个客户端在一定时间内没有发出后续请求,服务器则认为客户端已经停止了活动,结束与该客户端的会话并释放Session对象。如果客户端超时后再次发送访问请求,那么服务器则认为这是一个新的会话。

    自定义ASP.NET Session Store Provider

        在ASP.NET提供的Session Store Provider,有以下四种模式:

    1、  InProc模式

    这是ASP.NET默认的Session管理模式,在应用进程内维护Session。

    2、  StateServer模式

    这是在服务器装了.NET环境后自带的一个StateServer服务,在应用进程外管理Session,可以进行多应用间的Session共。

    3、  SQLServer模式

    这是利用SQLServer进行Session的托管。其优点在于可以利用SQLServer的优势处理海量Session,在应用进程外、可持久化、安全性高等优点。

    4、  Custom模式

    这是自定义模式,发挥空间很大,在拥有Provider的情况下,可以利用这一模式进行发挥,利用各种各样的数据存储程序进行Session管理。

        下面我们将使用Custom模式,一步步来实现Session存储,数据存储程序使用MongoDB。步骤如下:

    1、创建一个MongoSessionStateStoreProvider类并继承SessionStateStoreProviderBase。

    2、重写SessionStateStoreProviderBase类中的虚方法

    3、定义序列化和反序列化的接口ISerialization及实现接口类,因为需要把Session序列化后再存储

    4、配置Web.confg文件,在System.web节点里添加SessionState节点,并自定义其子节点Provider的属性
    image

    • name属性是当前Provider的名称
    • type属性值就是上面定义的MongoSessionStateStoreProvider类,点号前是命名空间,逗号后面是dll文件名称
    • applicationName属性当前应用程序名称
    • connectionStringName属性MongoDB数据库连接字符串connectionStrings节点名称,如下所示
      image
    • recordException属性表示是否记录异常,true则是,false则不是。
    • journal属性表示是否开启故障恢复和持久化
    • writeConcernLevel属性表示Mongo写入的后续处理方式

    好,废话不多说,直接上代码。

    image

    最后,代码下载,除了源码外这里有一个SessionStateStoreProvider执行顺序流程图可以帮助大家更好的理解SessionStateStoreProvider是怎么实现的

  • 相关阅读:
    图灵科普系列丛书封面有奖征集(贴图送书)
    图灵2010.03书讯
    博客园图灵杯第4届博问大赛(2.27~3.27)
    asp.net运行原理
    IIS与NET桥梁
    offsetParent解释
    XML 操作类库(开源项目)
    W3C不兼容问题(最根本的原因,及解决方案)
    深入理解JavaScript系列
    HttpApplication对象创建的细节
  • 原文地址:https://www.cnblogs.com/Khadron/p/MongoDB_Custom_Session.html
Copyright © 2020-2023  润新知