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