MongoDB实现ASP.NET 自定义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 Provider

    在ASP.NET提供的Session 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的属性

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

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

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

时间: 2024-08-03 15:23:33

MongoDB实现ASP.NET 自定义Session的相关文章

Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom

对于asp.net 程序员来说,Session的存储方式有InProc.StateServer.SQLServer和Custom,但是Custom确很少有人提及.但Custom确实最好用,目前最实用和最灵活一种方式,因为Custom可以实现各种情况的Session存储,特别对于大型网站尤为重要,解决Session丢失和Session效率的最佳实现方式,也是实现单点登录的最佳途径. 对于InProc.StateServer和SQLServer各自优缺点,网上一大堆,这里就不做详解. 重要的两点 1

Asp.net Mvc 自定义Session (一)

大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群. 这系列博客主要讲解  怎样 解决用户过多的session自动消亡,和分布式集群 使用例子 Session["test"] = "啄木鸟"; 完全不改变系统的使用风格,可以直接升级系统:     在这里我们主要用的 HttpRuntime.cache 和 memcache. 希望读者这跟着我的思路,一步一步来设计自定义Session 首先,

asp.net中session的原理及应用

Session简介丶特性 1.Session是一种Web会话中的常用状态之一. 2.Session提供了一种把信息保存在服务器内存中的方式.他能储存任何数据类型,包含自定义对象. 3.每个客户端的Seesion是独立存储的. 4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的. 5.Session不能跨进程访问,只能由该会话的用户访问.应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的. 6.当会话终止,或过期时,服

ASP.NET中Session的个人浅谈

看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意的.先简单的说下吧,Session是分为客户端Session和服务端Session: 客户端Session Session称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息,当用户首次与Web服务器建立连接的时候,服务器会给当前访问用户分发一个 SessionID作为标

asp.net自定义错误页面

ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件.Application_Error 事件以及应用程序配置文件 (Web.config). 如果您不调用 Server.ClearError 或者捕获 Page_Error 或 Application_Error 事件中的错误,则将根据 Web.config 文件的 <customErrors> 部分中的设置处理错误.在 <customErrors> 部分,可将重定向页指定为默认的错误页 (

ASP.NET中Session的sessionState 4种mode模式

1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. Off模式 <sessionState mode="Off"></sessionState> 关闭模式,即不需要使用Session. 单个页面关闭Session: <%@ Page EnableSessionState="false" %

Asp.net基于session实现购物车的方法

本文实例讲述了asp.net基于session实现购物车的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 7

使用 IntraWeb (40) - 自定义 Session 数据

修改 UserSessionUnit 单元: unit UserSessionUnit; interface uses IWUserSessionBase, SysUtils, Classes, IWApplication; type TIWUserSession = class(TIWUserSessionBase) procedure IWUserSessionBaseCreate(Sender: TObject); procedure IWUserSessionBaseDestroy(Se

ASP.Net的Session

ASP.Net中的Session是我见过最好的处理,是其它动态网页技术不能比拟的.ASP.Net中的Session再也不需要Cookies的支持,也就是说如果用户关闭了Cookie,Session的值一样也可以被保存. 不过,我们需要对config.web文件进行一些配制,因为在其中找到关于Session的设置文本,如: <sessionstate cookieless="false" /> 把cookieless="false" 改成cookieles