Windows Azure - 在Web Site下使用Azure SQL Database來存放Session

25 April 2013 — Written by Sky Chang
#ASP.NET#ASP.NET MVC#Azure#IIS#SQL Server

6/23更新 - 新做法請看這裡!!

4/30更新 - 目前小朱前輩已經提供了小弟我一個更好的做法,所以這幾天會再修改一篇出來,這篇是2010年的作法,就請大家多見諒 ( 文章出來後,會在這篇加上連結 )

很早就想把這篇補齊,但一直沒機會,剛好最近,因為要講課,所以就順便把這篇給補起來,這樣大家如果要查詢,就比較方便…

相信如果有讀過這篇( p.s 現在官方強烈建議,不要再用Azure Storage當Cache了),那可能會知道,不管是Cloud Service或是Web Site,前面都會有用到Load Balance,當然,如果後面只有一個站台,那就沒甚麼差,但如果後面有兩台以上的站台來分流,那Session的議題就變得很重要了…

而Cloud Service很佛心的準備了內建Cache來解決這部分的問題 ( 不然用Azure Cache會貴森森… ),那Web Site呢!?其實除了貴森森的Azure Cache外,還有大家常知的…沒錯!!就是使用SQL Server來存放Session!!

當然,我們不會傻傻的Web放到Azure上,但卻把Session放在陸地上…所以,這篇的目的,就是要介紹,如何使用Azure的SQL Database來存放Session!! ( 嗯,或許大家會擔心效能上的問題,但根據可靠情報指出,目前Azure 上的SQL Database都是用SSD喔!! )

( 這篇原文出處於http://blogs.msdn.com/b/sqlazure/archive/2010/08/04/10046103.aspx )

準備SQL Database

首先,我們當然要先去SQL Database來開一個新的SQL Server,這邊我們是要測試,所以很快的快速創建就好。

image

接下來,我們直接進入管理的畫面吧;這邊要特別特別注意,我們要從SQL Database( SQL 數據庫 )這邊點下去,然後選擇服務器那邊的超連結。這樣做的原因很簡單,因為我們等下要在Master資料庫進行作業,所以如果點了前面的ASPNETSessionTest資料庫,那等下進入管理的介面,就會無法使用轉移到Master進行管理,所以我們要從Server的地方連進去。

image

接下來,選擇管理。(大家可以發現,這邊選的就不是什麼ASPNETSessionTest了,而是整台伺服器的名稱 )

image

預設SQL Database的防火牆是沒開放的,所以這邊要允許通過。

image

接下來,輸入帳號密碼,資料庫的部分可以空白不選。( 感謝好友Terry提醒~ )

image

如果是以前,我們在陸地上的時代,我們可能可以使用ASP.NET提供的ASPStateInstall.sql來建立ASPState,但在Azure的SQL Database,則沒那麼容易,因為SQL Database有許多的權限是不可以執行的,所以如果用原本的作法,會碰到釘子,所以我們要利用官方提供給我們的,修改過的版本。

下載位置在這邊

然後,我們就可以利用下載下來的這兩個sql,來建立必要的東西。

建立

當進入管理介面的時候,我們就可以點選選取資料庫。

image

我們這邊先使用master。

image

之後,我們選擇開啟,然後就可以選擇剛剛下載下來後的其中一個檔案ASPStateInstall.sql。

image

打開後,其實也就只有這樣,但不管怎樣,我們還是執行吧。

image

執行完成後,我們要切換到剛剛建立好的這個db (ASPState)。選擇資料庫後,就可以找到ASPState,然後點一下後,就會出現小圖可以選,選擇"摘要"後,就可以進去管理。

image

這邊的步驟,就和之前的一樣了。只是這次選擇了InstallSqlState.sql。

image

這次的東西就很多了,一樣按下執行。

image

到這邊,SQL Database就準備妥當了。

ASP.NET的修改( MVC同 )

其實修改非常的簡單…如下圖,只需要到Web.Config裡面的SessionState那邊,改成SQL Server的設定就可以了。

( 如果Web.Config沒看到SessionState,可以安裝ASP.NET Universal Providers,但查詢的時候可能會找到ASP.NET Universal Providers Core,其實Core是ASP.NET Universal Providers的底層核心,當安裝ASP.NET Universal Providers的時候,就會順便把ASP.NET Universal Providers Core裝起來,並且順便修改Web.Config;但如果直接裝Core,則不會協助幫忙修改Web.Config,變成要自己在Web.Config加上後面的那段程式碼。 )

image

這邊貼上原始碼,方便大家複製貼上。

    <sessionState mode="SQLServer"
    sqlConnectionString="Server=tcp:klm4dkemn2.database.windows.net,1433;Database=ASPState;User ID=sky@klm4dkemn2
    ;Password=P@ssw0rd;Trusted_Connection=False;Encrypt=True;"
    cookieless="false" timeout="20" allowCustomSqlDatabase="true" />

完成後,我們就可以用一些瀏覽器的工具,來查看Cookie裡面紀錄的Session ID。

image

透過我們建立起來的ASPSTATE這個資料庫,我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。

image

這樣就完成了~

後記

現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,有興趣的朋友可以試驗看看喔!!

參考資料

我們可以透過Azure的db管理工具,看到Sessions Table已經自動幫我們建立起來了。

image

我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。

image_thumb4

題外話,因為Web Site前面的LB機制會自動認ip,所以通常狂按F5是測試不出來的,所以如果覺得這樣還不能證明,還可以手動去調整Web Site,如果沒有把Session存放到DB裡面去,當改變Web Site的時候,是會掉Session的,但如果存到db裡面去,就不會有這種問題了。

image

基本上,這樣就完成了~

後記

現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,重點是,也不用自己多做甚麼事情,幾乎都可以輕鬆搞定,這邊,也很感謝小朱前輩利用中午吃便當的時候,一邊被我騷擾,一邊和我說有這種東西,在這邊再次感謝他,如果大家有興趣,下面的參考資料,也有小朱前輩上次上課的超詳細步驟解說!!

最後的最後,也提醒大家一下,這邊的範例,因為方便,所以在撰寫的時候就直接把Connection換成Azure SQL Database,如果在真正的專案執行上,也可以透過VS的發佈工具,動態的改變DB的Connection String,讓開發的時候使用LocalDB,正式的時候,使用Azure SQL Database喔~

以上,謝謝大家~~

參考資料

專案下載

Sky & Study4.TW