2013年4月25日

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

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的效能也好很多,有興趣的朋友可以試驗看看喔!!

參考資料

沒有留言:

張貼留言