淺談在Azure云中部署支持MVC的ASP.NET程序
之前我就像某人說的那樣,I’m not quite a cloud guy,但是后來看了各式各樣的演示,認識了 Cloud Project 的構成,以及 Mix 09 里面某人說 "It’s fun!” 以后,就沖著這句 It’s fun,我就扔了個 Hello World 上去,感覺還不錯的,但是缺乏做點什么的動力,后來就丟在一邊了。差不多的時間知道了 Google App Engine, 但不知GAE 猴年馬月才能用 .Net 技術的,我不會python/java,而且現在貌似 GAE 沒有跟 WorkerRole 相應的東西,但是好歹也用上了GAppProxy,也叫在 Google 的云上爽了一把。
這個情況下,在心愛的微軟的云上卻只有一個 Hello World 實在太說不過去了,于是打算找一段時間,將自己認識的有能力演示出來的東西都搞到云上去,反正現在 Azure 是免費的(希望以后的收費政策是 GAE 現在那種模式吧),不用白不用,浪費了自己漂亮的域名多可惜啊。好,就從剛 Release 不久的 Asp.Net MVC 開始。
如何開始
現在的 Visual Studio Tools for Azure(0903CTP) 是沒有安裝所謂的 MVC WebRole 模板的,也就是在 Roles –> Add –> New Web Role Project 不能搞出一個以 MVC 結構開始的模板,只有 Default.aspx、web.config:
顯然不夠,然后發現 Roles –> Add –> Web Role Project in solution.. 選項不能用,于是刪掉默認的 Web Role Project,新建一個 MVC Web Application 到解決方案,發現該選項仍然是無效的:
這時候,我的做法是用 diff 工具比較 MVC 項目文件 (C# 項目就是 .csproj 了) 和 Web Role 的項目文件,發現 MVC 項目文件沒有
如果像我在開始的時候順便創建了測試項目的話,在上面這個過程可能會造成測試項目丟失對MVC項目的引用,編譯時會提示,加上即可。現在,按 F5 調試,等一輪初始化過程,MVC 項目默認首頁出來了。這就完成了嗎?
AspProviders & StorageClient
是差不多了,但是在 Azure 上運行的應用程序可以有多個 Instances 的,每個 Instance 運行在不同的 Appdomain 里(瞎猜的,甚至可能在不同的虛擬機中,分布在不同的地理位置……),反正是隔離的,那么像登陸這類需要 Session 的操作會產生一些問題,具體什么問題很難說,我沒試過,大概就是注冊不了啊,登陸記不住之類的。這時候發揮 Google 的長處,會有驚喜的,我找到了 4 篇(1,2,3,4)相關的文章,原文都是英文,比較詳細,另外還有幾篇出自園友。除了關鍵的步驟,我就不重復他們的東西了。
說起來慚愧,我不是讀計算機專業的,之前學過一點 Asp,沒怎么學習過 Asp.Net,因此很多東西都是不久前才知道的,例如 Asp.Net 2.0 的 Provider Model。在這里 Provider Model 抽象出儲存的實現,使得 Asp.Net 的各種狀態可以自由選擇儲存在不同的媒介中,而且可以通過配置文件更改,不得不說這個設計實在非常好。上面給出的第四篇相關文章就敘述了怎么打造一個可以在 Cloud 運行的 Membership Provider。
在 Azure SDK 的安裝目錄中,有一個 Samples.zip,里面包含有微軟提供的 AspProviders 例子,該例子提供了利用 Azure Storage 作為狀態信息的儲存媒介的樣例,順便也做了使用里面 StorageClient 樣例的例子,哈哈,在這里能發掘不少東西的。因為 StorageClient 很多公共方法沒有文檔,給 Supress 了。
RTFM
AspProviders 文件夾里有一樣很重要的東西,就是 providers-extended-readme.mht,我覺得這個文件一定要重視,如果你不打算寫自己的 Providers 的話。里面有些代碼用紅色高亮了,可惜背景是灰色的,看完肯定報廢一只眼睛,建議拿 Word 把那里的背景顏色改成黃色,看起來就舒服多了。
以下是我 RTFM 總結后的做法,希望對大家有用:
1.修改 Web.config,使那些 Providers 生效。大部分代碼可以從 AspProvidersDemo 中復制。其中要修改的是 appName 屬性,修改成應用的名稱。Profile 的那個 inherits 屬性刪去,否則會出現運行時錯誤。
2.不使用readme 里面的標準 appSettings 設置 tableServiceBaseUri 等 addtional options,因為發布到云上就不能修改了,然而在本地調試的時候,用的是 local development storage。
3.修改 .csdef 和 .cscfg 文件,本地調試時按照 相關文章2 填寫,發布上傳之前,.cscfg 改成:
<ConfigurationSettings> <Setting name="DefaultProviderApplicationName" value="YourApplicationName"/> <Setting name="AccountName" value="YourStorageAccountName"/> <Setting name="AccountSharedKey" value="YourStorageAccountPrimaryKey"/> <Setting name="BlobStorageEndpoint" |
1.這里我加上了 DefaultProviderApplicationName 這條,否則用默認的:appName,有點惡心,這樣做記得在 .csdef 文件上加上相應的定義。(多口一句:怎么像 C++ 的 h 文件那樣啊,居然要自己聲明元數據……)一些已知的問題
在我給出的相關文章里有了,簡單歸納就是:
1.注意 Request.Url 的額外信息
2.安裝這個 HotFix(同時修復了一個 WPF 設計器的問題)
3.不明白為什么要 Create Test Storage Tables 的話,請看這里
最后
可能因為Azure 還是 Preview 階段吧,這些 Providers 的配置都要靠自己RTFM 然后人工完成,希望微軟以后能提供 Azure MVC WebRole Project 模板,集成一套 Azure AspProviders,以及 StorageClient。然后呢,繼續讓某些人罵微軟太體貼,哈哈!說實話,微軟雖然讓人感覺無時無刻都在 JIT,但這不是很好嗎,這樣才有激情,讓微軟有動力嘛……又跑題了……
【編輯推薦】