在以前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种状况下Session的处理。在ASP.NET提供的Session处理方法中,有如下四种模式:git
一、 InProc模式github
这是ASP.NET默认的Session管理模式,在应用进程内维护Session。web
二、 StateServer模式数据库
这是在服务器装了.NET环境后自带的一个StateServer服务,在应用进程外管理Session,能够进行多应用间的Session共享,在我看来这一模式最为适用于Web Garden模式。这在以前的博客里讲过。安全
三、 SQLServer模式服务器
这是利用SQLServer进行Session的托管。其优势在于能够利用SQLServer的优点处理海量Session,在应用进程外、可持久化、安全性高等优势。SQLServer模式很是适用于Web Farm环境session
四、 Custom模式less
这是自定义模式,发挥空间很大,在拥有Provider的状况下,能够利用这一模式进行发挥,利用各类各样的数据存储程序进行Session管理。今天这篇博客主要讨论这一模式下的Redis托管Session的应用。dom
在使用StateServer、SQLServer模式中,我遇到过一个很棘手的问题:Session Name的控制问题。在ASP.NET处理这个问题时,为了保证应用的统一,ASP.NET会对托管在IIS上的每一个应用ID作hash并做为存储在数据库中SessionId的前缀。这就留下了一个问题,若是在一台服务器上有多个应用,则必须保证每一个应用的ID在不一样服务器上彻底相同,不然就会出现Session没法共享的悲剧。而咱们进行应用部署的时候为了容灾,在一台服务器放多个应用是彻底有可能的,那么必定要注意IIS中应用ID的一致。更麻烦一点的用法是利用反射修改SessionId生成规则或者修改数据库存储过程,强制前缀统一,这个方法较为麻烦,并且在必定程度上下降了应用的性能,故不推荐。ide
今天我推荐的是利用第三方Provider托管Session。第三方Provider不少,例如Oracle,Memecache,Redis,Mongodb,都有不少Provider,若是你对本身的技术信得过,也能本身继承System.Web.SessionState. SessionStateStoreProviderBase这个类进行扩展。
而我使用的是这个Provider:Harbour.RedisSessionStateStore,
GitHub:https://github.com/TheCloudlessSky/Harbour.RedisSessionStateStore
这个Provider是在ServiceStack.Redis做为Redis Driver的基础上进行开发的。
使用很是简单,首先,搭建好你的Redis环境,将Harbour.RedisSessionStateStore、ServiceStack.Redis添加引用,而后修改Web.config的配置以下:
<system.web> <sessionState mode="Custom" customProvider="RedisSessionStateProvider"> <providers> <clear /> <add name="RedisSessionStateProvider" type="Harbour.RedisSessionStateStore.RedisSessionStateStoreProvider" host="localhost:6379" clientType="pooled" /> </providers> </sessionState> </system.web>
其中最为关键的是host属性,指向了你的Redis服务的IP/端口。在使用Redis中,你也能够为Redis配置密码,而配置文件中须要修改host属性为:password@localhost:6379。clientType默认设为pooled链接池模式。若不使用链接池模式则修改成其余字符串(空也视为pooled模式)。
这个Provider有一个特色,不针对应用ID为Session加前缀,这正是我所须要的特性,更方便多个系统之间的Session共享。接下来,配置Cookie域,将须要共享Session的应用全设在同一个顶级域名的域下:
<system.web> <httpCookies domain="cnblogs.com"/> </system.web>
如此这般使用Redis托管Session的工做就作完了。
=========================增长注意事项=====================
Harbour.RedisSessionStateStore这一个库依赖于ServiceStack.Redis进行Redis操做,可是只支持到ServiceStack.Redis 3的版本,4的版本不支持!做者在Nuget上的包没有作这一依赖限制,因此Nuget直接引用的话会出问题。把ServiceStack.Redis换为3.X就行了,我作了一个分支,支持4的版本,请求并入master,可是做者不一样意,他原话是酱紫的:I do not plan to support v4 of SS.Redis with this library because of the non-free change~因此使用中出现问题请注意这个缘由。
若有错误,欢迎你们指正,欢迎转载,但请注明出处。