ASP.NET下跨應用共用Session和使用Redis進行Session託管簡介

來源:互聯網
上載者:User

標籤: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託管簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.