码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-04-21 10:14:09      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

来源引用网络文章

 

在ASP.NET提供的Session处理方法中,有以下四种模式:

1、  InProc模式

 这是ASP.NET默认的Session管理模式,在应用进程内维护Session。
 
2、  StateServer模式
 
这是在服务器装了.NET环境后自带的一个StateServer服务,在应用进程外管理Session,可以进行多应用间的Session共享,在我看来这一模式最为适用于Web Garden模式。这在之前的博客里讲过。
 
3、  SQLServer模式
 
这是利用SQLServer进行Session的托管。其优点在于可以利用SQLServer的优势处理海量Session,在应用进程外、可持久化、安全性高等优点。SQLServer模式非常适用于Web Farm环境
 
4、  Custom模式
 
这是自定义模式,发挥空间很大,在拥有Provider的情况下,可以利用这一模式进行发挥,利用各种各样的数据存储程序进行Session管理。
 
       在使用StateServer、SQLServer模式中,有一个很棘手的问题:Session Name的控制问题。在ASP.NET处理这个问题时,为了保证应用的统一,ASP.NET会对托管在IIS上的每个应用ID做hash并作为存储在数据库中SessionId的前缀。这就留下了一个问题,如果在一台服务器上有多个应用,则必须保证每个应用的ID在不同服务器上完全相同,否则就会出现Session无法共享的悲剧。而我们进行应用部署的时候为了容灾,在一台服务器放多个应用是完全有可能的,那么一定要注意IIS中应用ID的一致。更麻烦一点的用法是利用反射修改SessionId生成规则或者修改数据库存储过程,强制前缀统一,这个方法较为麻烦,而且在一定程度上降低了应用的性能,故不推荐。
 
       我使用的是这个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>

  clientType默认设为pooled连接池模式。若不使用连接池模式则修改为其他字符串(空也视为pooled模式)。

 

     这个Provider有一个特点,不针对应用ID为Session加前缀,这正是我所需要的特性,更方便多个系统之间的Session共享。

    

     如此这般使用Redis托管Session的工作就做完了。

 

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

标签:

原文地址:http://www.cnblogs.com/sam-yau/p/5415592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!