在以前的博客中,我說到了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~因此使用中出現問題請注意這個緣由。
若有錯誤,歡迎你們指正,歡迎轉載,但請註明出處。