之前我就像某人说的那样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