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,這邊我們是要測試,所以很快的快速創建就好。
接下來,我們直接進入管理的畫面吧;這邊要特別特別注意,我們要從SQL Database( SQL 數據庫 )這邊點下去,然後選擇服務器那邊的超連結。這樣做的原因很簡單,因為我們等下要在Master資料庫進行作業,所以如果點了前面的ASPNETSessionTest資料庫,那等下進入管理的介面,就會無法使用轉移到Master進行管理,所以我們要從Server的地方連進去。
接下來,選擇管理。(大家可以發現,這邊選的就不是什麼ASPNETSessionTest了,而是整台伺服器的名稱 )
預設SQL Database的防火牆是沒開放的,所以這邊要允許通過。
接下來,輸入帳號密碼,資料庫的部分可以空白不選。( 感謝好友Terry提醒~ )
如果是以前,我們在陸地上的時代,我們可能可以使用ASP.NET提供的ASPStateInstall.sql來建立ASPState,但在Azure的SQL Database,則沒那麼容易,因為SQL Database有許多的權限是不可以執行的,所以如果用原本的作法,會碰到釘子,所以我們要利用官方提供給我們的,修改過的版本。
下載位置在這邊。
然後,我們就可以利用下載下來的這兩個sql,來建立必要的東西。
建立
當進入管理介面的時候,我們就可以點選選取資料庫。
我們這邊先使用master。
之後,我們選擇開啟,然後就可以選擇剛剛下載下來後的其中一個檔案ASPStateInstall.sql。
打開後,其實也就只有這樣,但不管怎樣,我們還是執行吧。
執行完成後,我們要切換到剛剛建立好的這個db (ASPState)。選擇資料庫後,就可以找到ASPState,然後點一下後,就會出現小圖可以選,選擇"摘要"後,就可以進去管理。
這邊的步驟,就和之前的一樣了。只是這次選擇了InstallSqlState.sql。
這次的東西就很多了,一樣按下執行。
到這邊,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加上後面的那段程式碼。 )
這邊貼上原始碼,方便大家複製貼上。
<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。
透過我們建立起來的ASPSTATE這個資料庫,我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。
這樣就完成了~
後記
現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,有興趣的朋友可以試驗看看喔!!
參考資料
- http://blogs.msdn.com/b/sqlazure/archive/2010/08/04/10046103.aspxcom/-EaXA4dfl5QA/UcbT2mOXszI/AAAAAAAAGac/5QUDqJfKY1A/s1600-h/image_thumb51%25255B2%25255D.png)
我們可以透過Azure的db管理工具,看到Sessions Table已經自動幫我們建立起來了。
我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。
題外話,因為Web Site前面的LB機制會自動認ip,所以通常狂按F5是測試不出來的,所以如果覺得這樣還不能證明,還可以手動去調整Web Site,如果沒有把Session存放到DB裡面去,當改變Web Site的時候,是會掉Session的,但如果存到db裡面去,就不會有這種問題了。
基本上,這樣就完成了~
後記
現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,重點是,也不用自己多做甚麼事情,幾乎都可以輕鬆搞定,這邊,也很感謝小朱前輩利用中午吃便當的時候,一邊被我騷擾,一邊和我說有這種東西,在這邊再次感謝他,如果大家有興趣,下面的參考資料,也有小朱前輩上次上課的超詳細步驟解說!!
最後的最後,也提醒大家一下,這邊的範例,因為方便,所以在撰寫的時候就直接把Connection換成Azure SQL Database,如果在真正的專案執行上,也可以透過VS的發佈工具,動態的改變DB的Connection String,讓開發的時候使用LocalDB,正式的時候,使用Azure SQL Database喔~
以上,謝謝大家~~
參考資料
- http://blogs.msdn.com/b/sqlazure/archive/2010/08/04/10046103.aspx
- http://msdn.microsoft.com/en-us/library/ms178586%28v=vs.100%29.aspx
- http://www.dotblogs.com.tw/regionbbs/archive/2013/04/27/global.windows.azure.bootcamp.2013.aspx