標籤:blog http io ar os 使用 sp strong 檔案
在之前的部落格中,我說到了Session的共用問題,其中說到了Web Farm和Web Garden兩種情況下Session的處理。在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管理。今天這篇部落客要討論這一模式下的Redis託管Session的應用。
在使用StateServer、SQLServer模式中,我遇到過一個很棘手的問題:Session Name的控制問題。在ASP.NET處理這個問題時,為了保證應用的統一,ASP.NET會對託管在IIS上的每個應用ID做hash並作為儲存在資料庫中SessionId的首碼。這就留下了一個問題,如果在一台伺服器上有多個應用,則必須保證每個應用的ID在不同伺服器上完全相同,否則就會出現Session無法共用的悲劇。而我們進行應用部署的時候為了容災,在一台伺服器放多個應用是完全有可能的,那麼一定要注意IIS中應用ID的一致。更麻煩一點的用法是利用反射修改SessionId建置規則或者修改資料庫預存程序,強制首碼統一,這個方法較為麻煩,而且在一定程度上降低了應用的效能,故不推薦。
今天我推薦的是利用第三方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屬性為:[email protected]:6379。clientType預設設為pooled串連池模式。若不使用串連池模式則修改為其他字串(空也視為pooled模式)。
這個Provider有一個特點,不針對應用ID為Session加首碼,這正是我所需要的特性,更方便多個系統之間的Session共用。接下來,配置Cookie域,將需要共用Session的應用全設在同一個頂級網域名稱的域下:
<system.web> <httpCookies domain="cnblogs.com"/> </system.web>
如此這般使用Redis託管Session的工作就做完了。
ASP.NET下跨應用共用Session和使用Redis進行Session託管簡介