ASP.NET下跨应用共享Session和使用Redis进行Session托管

         在以前的博客中,我说到了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~因此使用中出现问题请注意这个缘由。

    若有错误,欢迎你们指正,欢迎转载,但请注明出处。

相关文章
相关标签/搜索