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