65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Windows Azure 的校园分类广告

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2013年5月1日

CPOL

44分钟阅读

viewsIcon

23740

了解如何通过实际 Web 应用程序的构建过程来开始使用 Windows Azure。

引言

作为 Windows Azure 开发者挑战的一部分,本文将发挥双重作用。首先,它将向读者展示如何在五个指定区域中入门和使用 Windows Azure。其次,它将展示我是如何利用这些技能开发一套 Web 应用程序来支持我的项目。每个挑战都有自己的章节,每个章节内包含两部分内容。 

项目概述  

我的项目专注于校园分类信息网站。其理念是,像 Craigslist 这样的网站在服务大学校园方面不够专注。例如,如何寻找从校园回家的搭车?如何将你的书籍卖给同一校园中可能需要它们的人?如果你要在校园里举办派对并想做广告(但又不想邀请整个都会区的人)怎么办?

在本文中,我将构建三个网站。第一个将是一个销售网站,大学管理员可以为他们的大学/学院购买预先构建的校园分类信息网站。第二个网站将是一个实际的校园分类信息网站的演示。它将由 SQL(在 Azure 上)驱动,并将使用 Azure blob 存储进行图像上传。最后一个网站将是所有校园分类信息网站使用的支持论坛。这将由第三方公司管理,并且将在运行在 Azure 虚拟机上的开源支持软件上构建。最后一步是开发可以访问你注册的校园分类信息网站的移动应用程序。

竞赛网站 

为了保持简单,这里将所有挑战条目的链接放在一起。它们也列在各自章节的下方。

 

  1. 挑战一: <无特定网站,只有文章>
  2. 挑战二: http://ccsales.azurewebsites.net/ 
  3. 挑战三: http://samplecc.azurewebsites.net/ 
  4. 挑战四:  http://ccappsrv.cloudapp.net/login 
  5. 挑战五: http://samplecc.azurewebsites.net/Service/Item/4 

 

目录 

第一个挑战:入门

Azure 可能如何使我当前的工作受益或改变: Azure 将允许我快速开发复杂、相互关联的 Web 应用程序,这些应用程序可以根据我的增长需求进行扩展。这消除了快速增长或缓慢起步的担忧,因为我只需要为使用的部分付费,但当我需要时,强大的功能就在那里。

Azure 教程 

开始使用 Windows Azure 非常简单。但是,有几个部分可能会让你卡住,所以最好一步一步地进行。这将确保没有人会迷失或走弯路。

要开始,请访问 www.windowsazure.com。虽然根据你所在的位置,页面可能会有所不同,但你应该会看到类似此屏幕的内容: 

从这里,点击写着“免费试用”的绿色按钮。这将带你到下一页,该页面上有一个(冗余的)“免费试用”按钮。

 

单击第二个“免费试用”按钮后,你将看到一个登录屏幕。你需要使用 Microsoft 帐户进行登录。

 

不要将其与 Microsoft 电子邮件帐户混淆。你不需要 hotmail/outlook/live 帐户就能拥有 Microsoft 帐户。Microsoft 帐户只是你在 Microsoft 注册的任何电子邮件地址。例如,我在此项目中使用电子邮件地址 azure@timothycorey.com。与校园分类信息项目相关的所有内容都将通过此电子邮件进行处理,包括我的 Azure 托管信息。但是,当时,此电子邮件地址尚未在 Microsoft 注册为 Microsoft 帐户。要注册该帐户,我只需访问 signup.live.com 并填写相关信息。 

我在上述登录屏幕上发现的一个有趣之处是,它没有通过“注册”链接让我注册我的电子邮件地址。此页面假定我已拥有 Microsoft 帐户。但是,有一种方法可以使该“注册”链接出现。只需将你的电子邮件地址填入框中,然后在不输入密码的情况下按蓝色“登录”按钮。这将显示下一个屏幕。

 

如你所见,现在有一个“获取新帐户”链接,你可以点击该链接来注册你的电子邮件地址。如果你还没有电子邮件地址,此页面也将允许你创建一个 Microsoft 电子邮件帐户。完成注册/登录过程后,你将进入 Azure 注册屏幕。

 

这个三步向导将引导你了解你的试用版提供的内容以及你需要提供什么才能进行注册。请查看初始页面以熟悉试用版提供的功能,然后点击右下角的箭头。这将带你到向导的第二步。

 

Windows Azure 将通过电话呼叫或发送短信来验证你的帐户。这只是为了验证你是否是真实的人。这是一次性验证。你给他们的号码不会被存储(至少现在不会)。输入你的号码后,点击号码旁边的“发送短信”或“致电给我”按钮。这将触发对你的号码进行自动短信/呼叫。你将获得一个验证码,将其输入到电话号码下方的框中。填写验证码后,点击“验证码”按钮以处理该号码。只有这样,右下角的箭头才会启用,允许你继续下一步。

最后一步是信用卡验证: 

 

许多人在这一步感到担忧。免费试用不需要信用卡,对吗?我将为之付费吗?它会自动转换为付费服务吗?基本答案是:不用担心。信用卡输入有两个目的。首先,它具体验证你是谁。其次,如果你授权购买,它可以让你更容易地购买商品。默认情况下,你的 Windows Azure 帐户不会向你的信用卡收费。如果你的网站在一个月结束前达到其给定限制,网站将关闭而不是超出限制。如果你愿意,可以更改此设置,但这将意味着你的信用卡将因超额使用而收费。

完成向导中的最后一步后,你将注册一个 Windows Azure 试用帐户。然后,你将被重定向到一个类似此页面的页面。

 

这是帐户概览页面。但是,我假设你会想直接开始使用 Windows Azure。为此,请点击右上角的蓝色“门户”按钮。这将带你到门户仪表板。第一次访问这里时,会弹出一个快速教程向导。

花一分钟时间浏览这五个步骤。它将让你对门户网站及其可用功能有一个很好的概述。然后,你将看到实际的门户仪表板屏幕,它应该看起来像这样。

现在,你可以开始使用 Windows Azure 了。左侧将显示你当前使用的服务。左下角有一个“新建”按钮,可用于添加新服务。花些时间玩玩,熟悉一下可用的功能和 Windows Azure 的所有功能。一旦你开始进行 Windows Azure 开发,这个门户将成为你的主页。 

实际示例 

这一步没什么可做的。我按照上面列出的步骤注册了一个新的 Windows Azure 试用帐户。现在我为校园分类信息网站和服务设置好了我的门户,我熟悉了构成 Windows Azure 的众多不同产品。了解可用的功能有助于我规划如何最好地实现我的目标。

第二个挑战:构建网站

Azure 教程

在 Windows Azure 中创建网站再简单不过了。当你进入门户时,点击左下角的“新建”按钮,然后选择计算 -> 网站 -> 自定义创建。你还可以选择快速创建网站或从库中选择网站模板。这是该菜单的屏幕截图。

 

选择自定义网站选项后,你将看到一个类似这样的向导。

请注意,你可以选择你的区域(选择离你或你的客户最近的区域),设置或选择现有数据库,甚至选择从源代码管理发布你的网站的选项。如果你选择从源代码管理发布你的网站,你将看到下一个屏幕。

 

这些是 Windows Azure 支持的不同源代码存储库。由于我的项目中使用 TFS,我最初选择使用 Team Foundation Service 从源自动发布我的源代码。这会带到一个类似这样的屏幕,我可以在其中输入有关我的 TFS 存储库的信息。

 

不幸的是,当我尝试完成此步骤时,我收到以下错误。

事实证明,虽然该选项列在 Windows Azure 中,并且似乎一切正常(直到它不起作用的那一刻),但从 TFS 发布到 Windows Azure 尚不支持。最新消息是,微软希望在今年夏天之前支持它。

无论你决定如何配置你的网站,一旦你完成了该过程,你将在你的门户中看到一个类似此的条目。

当你第一次点击你的新网站时,你将看到以下快速入门屏幕。

你也可以通过点击顶部附近的“仪表板”旁边的带闪电符号的云图标返回到此屏幕。我在这里建议做的一件事是点击“设置部署凭据”链接。如果你这样做,你将看到以下弹出窗口。

 

这将允许你设置将用于你的网站的 Git 和 FTP 的用户名和密码。

回到入门屏幕,你会注意到你也可以在此处将你的网站连接到源代码管理,获取 SDK,甚至安装 Web Matrix。由于我使用 Visual Studio 进行开发,因此我不会在此展示,但获取 Web Matrix 的过程非常简单。

当你进入仪表板时,你将看到你网站的概述。

 

这里将完成你所有网站的管理工作。这里还有一些有用的工具。请注意右侧的“快速浏览”部分。这里是你获取 FTP 信息(如果你打算通过 FTP 上传你的网站)、你的网站 URL,甚至是你的 Visual Studio 和 Web Matrix 的发布配置文件。此配置文件使设置这两个工具变得轻而易举。在我的实际示例部分,你将看到一个关于如何使用此发布配置文件选项设置 Visual Studio 的示例。

现在你的网站已配置好并且文件已上传,你就拥有了一个工作的 Windows Azure 网站。密切关注该仪表板,因为它会告诉你何时接近限制。

实际示例 

在这个例子中,我将创建一个校园分类信息网站的销售网站。这个销售网站将面向想要为他们的学校购买校园分类信息网站的学校管理员。该网站将很简单,不需要数据库后端或登录系统。它将只有销售信息以及管理员联系我们公司的方式。我将称这个网站为 CCSales。

虽然它还没有完全具备功能,但我将使用 Team Foundation Services ( http://tfs.visualstudio.com/ ) 来托管我所有项目的源代码。这将使我能够创建一个开发系统,方便以后让其他开发人员加入。目前 TFS 在线对无限用户免费,尽管将来只对前五个用户免费。我还选择了 Git 作为我的源代码管理类型,因为我更喜欢 Git。

设置 

在我为 CCSales 在 TFS 中设置好我的项目后,我得到了这个屏幕。

请注意,我意外地在项目名称中包含了一个空格。这不是好事。这会导致 Visual Studio 集成设置出现错误和问题(并且错误不明确)。我的建议是不要在项目名称中包含空格。这会让所有人都更省心。坏消息是,我还没有找到一种方法来删除或重命名一个项目一旦它被创建。

我做的第一件事是点击“打开 Visual Studio 新实例”链接。对你而言,你可能需要在执行此步骤之前安装 Visual Studio Git 工具(注意:我认为此步骤需要 Visual Studio 2012)。如果你不确定,只需执行该步骤。Visual Studio 会很好地提示你需要什么。

当你用 Visual Studio 设置好 Git 并点击仪表板上的链接时,你将在新打开的 Visual Studio 实例中看到以下屏幕。

 

点击“克隆此存储库”链接,这将显示以下屏幕。

这设置了你的存储库本地副本将位于何处。默认情况下,Visual Studio 会指向你的根存储库文件夹。对于我的特定存储库,你会注意到我将其重命名为 CCSales。最初它是 CC%20Sales,这与远程存储库的 URL 匹配。如果我保留了这个名称,它将在 Visual Studio 中引起问题。 

在设置好 Visual Studio、TFS 和 Windows Azure 之间的所有内容后,我在我的本地存储库文件夹中创建了一个新的 ASP.NET MVC 4 应用程序。

 

接下来,我创建了一个 Home 控制器和一个 Index 操作的视图。这只是为了让 MVC 项目处于可工作状态。完成后,我右键单击我的解决方案并选择“提交”。我得到了以下屏幕。

我将我的提交命名为“initial commit”并点击了“提交”按钮。这将在本地提交我的文件。要将该提交发送到我的 TFS 服务器,我必须选择提交选项并点击“传出提交”上的“推送”。这将把本地提交发送到远程存储库。

此时,我的网站就可以发布了(只是为了看看它是否正常工作)。我右键单击我的项目并选择了“发布”。当我这样做时,这个向导弹出。

 

我导入了我从 Windows Azure 下载的“发布配置文件”文件(使用最新更新后,下载文件的步骤已不再需要 - 现在你可以直接指向 Azure 实例)。这带我到下一个屏幕。

 

在这里,我基本上只是验证了连接并点击了下一步。无需修改任何内容(该文件负责设置所有这些)。

 

下一个屏幕是设置屏幕。在这里,我做了一些相当明显的选择。我决定发布我的发布版本,并且不包含不必要的其他文件。我没有处理数据库部分,因为这个项目不使用数据库。

这带我到预览屏幕,在那里我可以预览将发布到我的 Windows Azure 网站的更改。在预览文件后(只是为了知道会发生什么 - 执行此操作并非必须成功发布),我的网站就上线了。

发布我的项目的这最后一系列步骤,一旦 TFS 允许自动发布指定的分支到 Windows Azure,就会消失。到那时,每当我将更改推送到远程主分支时,这些更改都会上线。这很棒,因为它会自动保持同步,而且我还可以将其他分支发布到测试网站。这样我就可以有一个测试服务器和一个实时服务器,它们可以从我的存储库自动刷新。

关于将 Git 与 ASP.NET MVC 结合使用的一个最终说明:你的 NuGet 包不会(也不应该)与你的项目一起上传到你的 Git 存储库。这意味着当你将项目下载到新计算机上时,一切都不会正常工作。所有引用都将丢失。Visual Studio 默认可以为你解决这个问题。在选项菜单中,你可以更改以下设置。

 

勾选框以允许 NuGet 在你构建时下载缺失的包。从那时起,你应该不会遇到从源代码管理下载项目的问题。

开发 CC 销售网站   

完成的网站链接: http://ccsales.azurewebsites.net/ 

CC 销售网站的实际开发非常简单。我以 Twitter Bootstrap 作为起点,这给我带来了很多好处,包括响应式布局。对于主页,我甚至从他们的一个示例网站开始。这为我提供了一个可以开始调整网站的平台。拥有可工作的平台比从头开始更容易弄清楚你喜欢什么和不喜欢什么。

我特意将这个网站做得非常简单。它有三个页面(index、features 和 contact),内容很少。“网站的重点是不断引导用户购买校园分类信息网站(或者,在这种情况下,是在其可用时注册购买)。” 该网站仍处于“即将推出”模式,但一旦校园分类信息网站上线,该“即将推出”横幅将被滑块控件取代,该控件将展示 CC 网站的不同部分。

当你查看网站时,有几点需要注意。首先,整个网站几乎可以在任何屏幕尺寸上正常运行。这大部分得益于 Twitter Bootstrap 的响应式网格系统。例如,我的大多数“row”div 都有一个名为“row-fluid”的类。这意味着开箱即用,当网站对于正常的 12 部分网格来说太小时,单元格将堆叠在一起。我添加的一个调整是在 features 页面上。当页面缩小到手机尺寸时,图像会有些分散注意力。它们占用了大量空间,并没有真正为页面增添价值。我通过将“hidden-phone”类添加到它们的 div 中来解决这个问题。Twitter Bootstrap 使用媒体查询来识别不同的分辨率集。当分辨率缩小到大致的手机尺寸时,我的图像将消失。现在即使在小尺寸下,我的 features 页面也看起来不错。

下一个需要注意的关于网站的是它的简单性。我特意创建了一个独立的网站,它不使用很多高级功能。一方面,这种类型的网站不需要许多高级功能。另一方面,我不想分散对 Windows Azure 网站使用的注意力。这意味着我的联系页面不会写入 SQL 数据库。相反,它使用 .NET 邮件程序将完成的表单的副本发送给我。无论我如何处理此表单(电子邮件、数据库等),我都会让自己暴露于被利用的风险中。我选择不在此表单上放置 CAPTCHA,因为那些对最终用户来说很烦人,并且可能将人们拒之门外。我将容忍通过表单发送的垃圾邮件。但是,我确实想限制我表单的漏洞。这就是为什么我使用了 AntiForgeryToken。在 .NET 中做到这一点非常容易。在你的表单上,添加 @Html.AntiForgeryToken()。然后,在处理 POST 的控制器操作上,只需将 [ValidateAntiForgeryToken] 添加为装饰器。

我没有在我的网站中添加任何复杂的 JavaScript。事实上,除了 Twitter Bootstrap 的功能外,我只有三个 JavaScript 函数,它们都用于执行联系表单的验证和处理。我添加了 John Papa 的 ToastR JavaScript 库,作为一种比弹出警告框更友好的方式来通知用户的干净方法。

就是这样。校园分类信息销售网站已全面上线并运行。即将推出的标志着校园分类信息网站的销售,而不是销售网站本身。销售网站将收集潜在客户的信息并将其发送到销售收件箱进行处理。

第三个挑战:在 Azure 上使用 SQL 

Azure 教程 

在 Azure 上设置 SQL 比设置网站更简单。事实上,如果你正在设置一个新的网站,其中一个选项是在该过程的一部分中设置 SQL 实例。如果你选择这条路线,你可以将你的新网站连接到现有数据库(如下方操作),或者你可以创建一个新数据库。

如果你决定在它自己的基础上创建数据库,你需要转到以下屏幕开始。

无论哪种方式,一旦你开始数据库创建过程,选项就不多了,如下图所示。在我们的例子中,我们将使用一个最大容量为 1GB 的 Web 数据库。这是 Azure 试用版附带的免费版本。 

一切设置好后,你将能够从主要的 Azure 仪表板访问你的数据库。你将在数据库上看到的第一个屏幕如下所示。

要返回到此屏幕,请点击左上角附近的带闪电符号的小云图标。此页面技术上不是必需的,因为你可以在其他地方执行所有这些任务。但是,这是开始数据库管理的好方法。常用任务都在这里。我使用此屏幕作为一种清单,以确保在尝试使用服务器之前,我已经完成了配置服务器的所有工作。设计器工具只需下载一次,入门项目并非真正必要,但下一个选项非常重要。Windows Azure 防火墙阻止任何计算机直接访问你的数据库。我总是会在这里解除封锁我的家庭 IP 地址。这再简单不过了。要解除封锁你的 IP 地址,请点击链接并按照简单的说明进行操作。它会为你发现你的 IP 地址,因此没有复杂的设置。

注意: 如果你连接数据库时遇到问题(即使是通过 Web 客户端),很可能是你忘记解除封锁你的 IP 地址,或者你的 IP 地址发生了变化(家庭 IP 地址有时会改变)。

下一个任务是实际使用你刚创建的数据库。这是你可以通过多种不同方式执行操作的地方。例如,你可以上传现有数据库(有某些限制),你可以运行一系列 T-SQL 命令来设置你的数据库结构并填充你的表,你可以使用在线编辑器来创建你的对象并填充它们,或者你可以使用 SQL Server Management Studio 或 Visual Studio 等工具。这些选项中的每一个都有其适用的场景。我个人使用过每种方法,并发现每种方法都相当简单。在这个例子中,我将向你展示一些使用 Visual Studio 的截图,因为我们已经在该环境中工作了。首先,要创建一个表,你可以使用可视化编辑器或直接编辑 T-SQL。

当你完成编辑后(是的,你可以编辑其中一个,你的更改将在另一个窗口中反映出来),点击“更新”按钮。这将触发更改的预览。它还将允许你生成一个脚本来执行这些更改,以及/或它将允许你直接将这些更改推送到你的数据库。

就是这样。一旦你创建了所有的表、存储过程等,你就拥有了一个在 Azure SQL 中工作的数据库。 

实际示例 

这是我将引用的示例网站(以及我的挑战条目): http://samplecc.azurewebsites.net/ 

这是事情真正变得有趣的地方。你在云中有一个数据库,你在同一个云中有网站。你如何在设计时和运行时将它们连接起来?坦率地说,我发现答案非常简单,以至于难以置信。

连接到 Azure SQL 数据库实例与连接到你旁边服务器机架中的 SQL 实例没有任何区别。你使用连接字符串来处理让代码知道数据库位置的事宜。 

注意: 请勿将你的连接字符串存储在 web.config 文件中,尤其是当该文件包含在源代码管理中时。这会使你的密码容易被发现。你可以对其进行加密,但更好的解决方案是使用 Azure 配置中的连接字符串选项。它会在运行时根据需要将信息放在你的配置中,而不会将密码暴露给窥探的眼睛。 

我所做的是将我的连接字符串放入我的 web.config.debug 文件中。 这允许我在本地测试我的网站,但在上传发布版本时,这些信息不会包含在内。我还指定我的 web.config.debug 文件不会包含在上传到我的源代码管理中。例如,你的 web.config.debug 文件可能有一个部分如下,用于替换连接字符串信息。

 

<connectionStrings>
  <add name="AzureConnection" providerName="System.Data.SqlClient" 
        connectionString="Server=tcp:server.database.windows.net,1433;Database=CampusClassifiedsDB;User ID=user@server;Password={pwd};Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</connectionStrings> 

 

现在,在 Azure 中,你可以在(你网站的)配置部分设置一个连接字符串替换值,如下所示。

现在,当你上传你的网站时,你的密码将是安全的,并且你的网站将在本地和远程正常工作。另一个选择是让本地数据库与在线数据库不同。这将允许你使用测试数据而不会影响你的实时网站。要做到这一点,只需更改你的 web.debug.config 文件,使其指向不同的数据库(例如,即使是本地 SQL 或 SQL Compact 数据库)。 

对我而言,我不是 Entity Framework 的大粉丝,所以我使用纯 ADO 连接来获取和输出数据。这允许我更容易地使用存储过程,并且更容易自定义数据访问层(我喜欢控制)。因此,我必须为我的应用程序做的一件事是为一切(读取、插入、更新和删除)创建存储过程。在 Azure SQL 中创建存储过程与在本地 SQL 服务器中创建一样。我只需运行我的 T-SQL 脚本,然后从我的代码中调用它们。

为了做到这一点,我甚至懒得通过设计器或工具。我只使用 Azure SQL 的 Web 界面。我点击设计我的数据库的链接(该链接位于我数据库的打开页面上)。这会带我到一个登录框(别忘了先解除封锁你的 IP 地址),如下所示。

我输入我的凭据,它会进入数据库设计器页面。我从列表中选择“存储过程”。

从那里,我创建一个新过程,根据需要添加参数和 T-SQL 代码。我保存它,甚至可以在那里进行测试。

我不会让你无聊于我如何创建每个过程,因为你可能已经明白了。一旦我完成了我所有的过程(显然也创建了我的表),就可以开始将所有内容连接起来了。

对于这个实际示例,我选择开发一个校园分类信息网站的示例。这将是我向潜在客户展示的网站如何工作的示例。上面的链接带你到该网站。我故意没有连接登录屏幕或任何网站更新页面。这个网站是一个演示。我不想像管理真实的校园分类信息网站那样来管理它。

因此,为了访问数据,我使用了一个我熟悉的(数据访问层)。它是标准化且简单的。要读取数据,我使用以下方法。

 

/// <summary>
/// Reads the data out into a DataTable
/// </summary>
/// <param name="connectionString">The connection string</param>
/// <param name="sqlQuery">The SQL string to execute</param>
/// <param name="parameters">Any SQL parameters to add</param>
/// <returns>A DataTable of the returned data</returns>
public System.Data.DataTable ReadData(string connectionString, string sqlQuery, ref List<SqlParam> parameters)
{
    DataTable myTable = new DataTable();
            
    using (SqlConnection cnn = new SqlConnection(connectionString))
    {
        cnn.Open();
        using (SqlCommand myCommand = new SqlCommand())
        {
            SqlParameter param;
            myCommand.CommandText = sqlQuery;
            foreach (var entry in parameters)
            {
                if (entry.ValueLength > 0)
                {
                    param = new SqlParameter(entry.Name, entry.ValueType, entry.ValueLength);
                }
                else
                {
                    param = new SqlParameter(entry.Name, entry.ValueType);
                }
                param.Direction = entry.Direction;
                param.Value = entry.Value;
                param.TypeName = entry.TypeName;
                            
                myCommand.Parameters.Add(param);
            }
            myCommand.Connection = cnn;
            using (SqlDataReader reader = myCommand.ExecuteReader())
            {
                myTable.Load(reader);
            }
            foreach (SqlParameter item in myCommand.Parameters)
            {
                parameters.Find(p => p.Name == item.ParameterName).Value = item.Value;
            }
        }
    }
    return myTable;
} 

 

请注意,我正在传递一个自定义参数对象。该对象描述每个参数。这样,我们可以以不同于 nvarchar 的方式传递 int。在处理 ADO 连接时,这是一个重要的问题。否则,会有后台数据类型转换,这可能会导致严重的开销。这是那个参数类。

 

public class SqlParam
{
    /// <summary>
    /// Loads the default values for each item so
    /// they don't all need to be set to be used.
    /// </summary>
    public SqlParam()
    {
        this.ValueType = SqlDbType.VarChar;
        this.ValueLength = 0;
        this.Direction = ParameterDirection.Input;
        this.Value = string.Empty;
        this.TypeName = string.Empty;
    }
    public string Name { get; set; }
    public object Value { get; set; }
    public SqlDbType ValueType { get; set; }
    public int ValueLength { get; set; }
    public ParameterDirection Direction { get; set; }
    public string TypeName { get; set; }
} 

 

现在你已经看到了这两者,在我彻底让你失去兴趣之前,让我解释一下我正在做什么以及为什么。我想要一种调用数据访问层来获取数据的方式。我希望它简单、快速且易于复制。我还希望能够轻松地切换数据库类型。例如,如果我明天想为同一个项目使用 MySQL,我不想改变太多。上面的代码满足了这一需求。我使用一个接口来调用 ReadData 方法(我还有一个 WriteData 方法,它执行 ExecuteNonQuery,但它使用相同的参数类型并具有相同的模式)。 如果我想更改代码,我只需要让我的工厂提供该代码的 MySQL 版本而不是 SQL 版本。

至于易用性,让我告诉你我是如何获取数据的。

 

IDataAccess data = Factory.DataAccess();
List<SqlParam> parameters = new List<SqlParam>();

parameters.Add(new SqlParam { Direction = System.Data.ParameterDirection.Output, Name = "@TimeElapsed", Value = 0, ValueType = System.Data.SqlDbType.Int });
parameters.Add(new SqlParam { Direction = System.Data.ParameterDirection.Input, Name = "@SearchValue", Value = searchText, ValueType = System.Data.SqlDbType.NVarChar, ValueLength = 50 });

DataTable results = data.ReadData(Factory.ConnectionString("A"), "exec dbo.up_SearchSalesEntries @TimeElapsed OUTPUT, @SearchValue", ref parameters);

 

就是这样。 我向工厂请求一个 DataAccess 实例,它会返回一个可与 SQL 配合使用的实例。然后我创建两个参数(一个输出参数,一个输入参数)。我将所有这些(我的工厂也提供连接字符串)传递进去,然后弹出一个包含我所有数据的 DataTable。参数现在也包含输出信息(它以 ref 的形式传入,这意味着相同的参数会用输出值更新。我将这些数据映射到我的模型(有些我手动处理,但 AutoMapper 是你的好帮手)。 

看起来我在这里没分享太多,但真的没有什么可说的了。一旦你的数据库在 Azure SQL 中,如果你已经让你的代码与 SQL 数据库协同工作,那么“转换”过程大约需要 30 秒。只需将你的连接字符串指向 Azure SQL 连接字符串(它已提供 - 多么酷啊!),你就完成了。

如果你查看我的演示网站,你看到的所有数据都来自数据库。所有的帖子、列表,甚至精选版块都直接通过存储过程来自数据库。我将数据转换为我的模型,然后只显示模型。 

第四个挑战:虚拟机 

Azure 教程

如果你读到这篇文章的这里,你对 Microsoft Azure 门户已经相当了解了。我们毫不费力地创建了网站和 SQL 服务器。现在我们将进入一个更高级的主题:虚拟机。从技术上讲,我们已经使用了 Azure 虚拟机。每次你启动一个网站(或 SQL Server 等)时,你实际上都在创建一个虚拟机。区别在于它们是 Microsoft 控制的虚拟机。它们负责这些虚拟机的更新、修补和配置。 

我们将从这个受保护的港口驶入原始虚拟机的汹涌大海。这将允许我们控制服务器的一切,但也意味着我们需要维护它。如果服务器有补丁发布,我们需要自己应用。

此解决方案的好处是多方面的,但也有其局限性。它们包括

 

  • 测试服务器 - 你可以创建模拟生产环境的测试服务器,以便尝试不同的配置或更改,而不会影响你的实时服务器。
  • 热备用服务器 - 你可以在云中配置一个热备用服务器来支持你的本地服务器。随着越来越多的服务器支持此功能(包括 SQL Server 2014),这一点将变得更加重要。
  • 自定义应用程序托管 - 如果你有一个无法在标准 Web 服务器上运行的自定义应用程序,你可以获得一个虚拟机来在云中运行你的应用程序。
  • 长时间运行的进程 - 如果你有一个需要很长时间才能完成的 Web(或桌面)应用程序,将其移动到虚拟机可能是一个不错的解决方案。

虽然在 Windows Azure 中使用纯虚拟机还有其他可能的原因,但这些是一些最常见的原因。这里的关键是,在投入使用虚拟机之前,一定要确定你的情况最适合使用虚拟机。

 

一旦你确定虚拟机是正确的选择,入门就相当容易(在 Azure 中你还能期待什么?)。首先,点击门户底部的“新建”链接,然后在计算部分选择“虚拟机”,如下图所示。

同样,你可以快速创建 VM,但我们将从库中选择一个,以便获得完整的体验: 

请注意,有大量的 Windows(和 Linux)VM 可供选择作为基础,但我们也可以选择我们已上传的映像。这将允许我们获取现有机器的映像并将其上传。我们也可以离线准备一个映像,然后上传完成的产品,而不是依赖预先构建好的映像。为了我们的目的,我们将选择 Windows Server 2008 R2 的预构建映像。 

选择好映像后,你将看到以下屏幕,它允许你设置有关服务器的一些基本信息,包括你的管理员登录名和密码。

下一步将允许你将此虚拟机连接到一个负载均衡的虚拟机集。如果你将在生产环境中使用虚拟机,并且认为负载对一台机器来说太重,那么你应该在同一区域添加第二台机器以实现负载均衡。

请注意,你可以选择你的存储帐户(如果你已配置好),或者你可以让它自动创建一个(多么棒的功能!)。为了我们的目的,我将选择东部(美国)作为区域,并且我将让存储为我创建。

接下来,我可以将此虚拟机添加到可用性集中。这允许我在某个数据中心发生中断时有效地保护我的虚拟机免受故障影响。我建议为任何需要高可用性的服务至少有一个服务器位于不同的区域。在此屏幕上,如果你正在配置预构建的 Windows 服务器,你可以允许 PowerShell 远程处理。我的建议是继续允许它。它将使管理更加容易。

服务器构建完成后(如果你同时创建了存储帐户,则为两台),你将在 Azure 门户的项目列表中看到它们,如下图所示(我创建的两台在突出显示的行下方)。

从这里,你可以直接进入你的两台服务器进行查看。例如,这是我的存储服务器的快速浏览。

请注意,此服务器有一个备份区域,并且启用了地理复制。这确保了如果美国东部区域发生故障,我的数据将在另一个区域可用。然后,我可以将 VM 连接到美国西部地区的存储,并很快恢复运行(如果我还没有配置好并运行一个)。 

在你的虚拟机的仪表板上,最重要的事情要注意,也是我最初错过的,是底部的菜单,它看起来像这样。

这是控制服务器的方式。例如,如果你有一段时间不再使用你的虚拟机,你可以关闭实例并节省运行 VM 的成本(这是截至 2013 年 6 月 3 日的新变化)。关闭你的虚拟机后,菜单将更改,如下所示。

现在你可以捕获此机器的映像。这用于在你想备份现有机器以供将来使用(或复制)的情况下。在执行此步骤之前,请确保你已对机器进行了 sysprep(或者,如果它是 Linux 机器,则在其上运行 Azure Linux 工具)。

请注意,此过程将在捕获映像时删除该机器。

启动机器时,如果你正在运行 Windows 虚拟机,你可以使用远程桌面完全访问该机器进行管理(如果你不想使用远程 PowerShell 来完成任务)。要做到这一点,请回到命令栏并点击“连接”。

这将触发 RDP 文件的下载。打开文件,你将看到类似此消息。

这是正常的。勾选“不再询问我的连接”复选框进行选择,然后按“连接”。然后,你将需要输入凭据。这些凭据是你创建虚拟机时在第一步中输入的。

当你点击确定时,你将收到另一个警告消息。再次,勾选“不再询问我的连接”复选框,然后按“是”。

此时,你应该已经进入了。你现在拥有对整个虚拟机的完全访问权限。你可以更改设置,运行更新,安装应用程序,并像使用普通服务器一样做几乎任何事情。 

实际示例 

对于校园分类信息,我选择让我的(想象中的)员工继续使用他们习惯使用的帮助台软件。但是,为了提高安装的可用性和可伸缩性,我选择将该软件托管在 Windows Azure 虚拟机上。为此,我遵循了上述所有步骤。当我完成了所有步骤并登录到我的 Windows Azure 虚拟机后,我上传并安装了我的 exe。此应用程序(Spiceworks)默认在端口 80 上设置一个网站。我配置了防火墙以允许端口 80 流量通过。所有配置就是这些。现在我有一个运行在 http://ccappsrv.cloudapp.net (Azure 在我的虚拟机仪表板中提供的 URL)上的帮助台。

这似乎是一个简单的设置,但这正是它的精妙之处。Microsoft Azure 虚拟机虽然比网站复杂,但设置和配置起来却很简单。即使你不确定某一步,很可能旁边都有一个小帮助对话框,告诉你这一步是做什么的以及你应该做什么。 

第五个挑战:移动访问 

Azure 教程

设置移动访问是我们 Azure 之旅的最后一站,也是最复杂的一站。酷之处在于,复杂性并非来自于实现此主题的难度,而是来自于你想要利用由此产生的力量。移动服务这个标题可能有点误导。你当然可以用它来开发 IOS、Android 和 Windows Phone 应用,但你也可以用它来开发网页。所以,让我们开始设置一个 Azure Mobile Service。

第一步,就像我们之前的所有示例一样,是在菜单中找到 Azure Mobile Service 选项。

这不难,对吧?所以,选择“创建”链接,你将看到以下屏幕:  

请注意,显示的数据库选项是一项新功能。你现在可以为你的移动服务获得一个 20MB 的免费数据库。这似乎不多,但实际上对于开发来说是足够的。一旦你的网站上线,你可以根据需要将数据库升级到更大(付费)的版本。你还可以选择指向现有数据库(确保匹配区域以避免数据传输成本和潜在的延迟问题)。

如果你确实决定为这个移动服务创建一个专用数据库,你将看到以下屏幕: 

为数据库命名,设置登录凭据并选择你的区域。这看起来熟悉吗?它应该。我们在第三阶段创建数据库时做过同样的步骤。

就是这样,设置 Azure 中的移动服务就完成了: 

上面的仪表板将是使用你的移动服务的起点。与其他服务一样,此页面提供了如何快速入门的概述。真正酷的部分是,此页面提供了针对你的平台的示例代码(有五种可供选择)。这是 Microsoft 真正摆脱过去的地方。这不是糟糕的 MSDN 文章,而是超实用的代码片段。要获得更深入的了解,请点击提供如何添加身份验证的链接。这将向你展示如何设置四种标准身份验证方法中的任何一种(包括 Facebook 和 Google)。在我的实际示例中,我将展示身份验证的代码,但要知道它直接来自列出的链接。

在你开始使用仪表板上的代码之前,你应该先创建一个表。转到“数据”选项卡并添加一个表: 

当你点击“添加表”时,你会看到这个: 

虽然这个页面并不复杂,但这是你开始使用基本表所需的一切。你决定每个 CRUD 操作所需的权限级别,并为表命名。我相信那些精明的 SQL 开发人员已经猜到了缺少什么:模式。列在哪里?很高兴你问了。移动服务数据库表默认是动态的。这意味着它们会根据传入的数据按需添加列。你可以按传统方式创建它们,但现在我们将保持原样。当我们将应用程序投入生产时,我们将更改标志以禁用表结构的动态修改。

我们在移动服务之旅的下一站是调度程序: 

创建新作业时,你可以选择作业的运行频率: 

这很棒。又一个有趣的功能,但这有什么意义呢?好吧,当你设置一个计划作业时,你可以在其中放置一段 JavaScript 代码,该代码可以调用服务、获取数据、更改数据库等。这对于清理数据、创建总计(而不是每次有人请求时都创建)或执行任何数量的其他有趣的事情都很有帮助。重点是选项几乎是无限的。

说到无限的奇迹,请注意,我甚至还没有提到 API、推送通知、身份信息以及许多其他有趣的功能。你可能(就像你在整篇文章中一样)是对的,我暂时不会深入探讨这些高级领域。如果一次展示太多选项,你将感到信息过载,而我希望这是一篇你可以使用的实用文章。我已经向你展示了如何获取示例数据访问代码、如何创建表,甚至如何设置一个计划来对这些数据执行一些操作。这些应该足以让你入门。一旦你对这些信息感到满意,请继续阅读我的实际示例。你将获得一个关于我如何使用这些基本信息以及如何在实际场景中使用的概述。 

实际示例 

我假设如果你正在阅读这篇文章,你已经对 Azure Mobile Services 的功能有了一定的了解。如果没有,请阅读此部分之前的章节。那将让你跟上进度。现在让我们深入探讨我实际上是如何利用 Azure Mobile Services 来构建我的校园分类信息网站,然后我将展示我具体是如何做到的。 

校园分类信息网站旨在成为学生、教职员工共享信息的中心,包括校园活动。任何一项好的活动的关键是了解谁会来。我决定实现一个粗略的校园活动报名表。在本迭代中,我们将只允许一个人表明他们是,他们将参加某个特定活动。他们不应该能够看到其他人的注册信息,他们不应该能够为除自己以外的任何人报名,他们应该知道自己何时已报名。

在评估了用例后,我确定我们首先需要能够识别用户。这意味着身份验证。我记得身份验证用户的想法曾经让我望而却步。幸运的是,我不再需要“不小心”格式化我的计算机来避免身份验证的痛苦了。相反,我只需要按照此处的简单分步说明进行操作:http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-users-html/ 

很简单,对吧?我这么认为。我想分享一个我创建的、用于连接这个的非常棒的代码,但是……嗯,它实际上是复制粘贴的微软的代码。不要过度思考,只需照做。你不会后悔的。

现在我已连接好身份验证,我认为设置表并连接它会和这一样简单。我的意思是,那个代码片段看起来足够简单了。这就是我很快偏离正轨的地方。我想要安全地检查某个特定用户的记录。我还想尝试那个动态表创建功能。最后,我想要一个易于使用和理解的系统。让我们快进到我不断地用头撞键盘的部分,然后到达我看起来像我懂了的部分。

首先,这是我开发的用于写入表中的代码: 

var data = {
    eventId: 1,
    username: 'Tim'
};
client.getTable("signup").insert(data).done(
    function (results) {
        //Figure out what you want to do on success
    },
    function (error) {
        //This is a quick and dirty error message
        alert(JSON.stringify(error));
    }); 

让我们看一秒钟的代码。首先,我正在创建一个数据对象,其中包含两部分测试数据。这两部分数据将成为表中的两列。接下来,我调用 client.getTable('signup').insert(data)。这会将数据实际放入 signup 表中。之后,我将两个函数附加到 done 事件。第一个处理成功选项。第二个处理我们可能出现错误的情况。在我的例子中,我在成功函数中启动了一个方法,该方法会重新评估要隐藏和显示的 DIV。请注意,如果你想设置你的表,你可以运行一次像这样的代码,用虚拟数据来获取你的列。然后你就可以进入 Azure 页面并删除虚拟数据(表结构将保留)。 

下一步是从数据库中读取数据。这是我这样做的代码。

var query = client.getTable("signup").where({ eventId: id });
query.read().done(
    function (results) {
        if (results.length > 0) {
            //You have data
        }
        else {
            //You don't have data
        }
    },
    function (error) {
        alert("Error Occur during Reading data .." + JSON.stringify(error));
    }); 

这段代码与我们之前用于写入数据库的代码非常相似。最大的区别可能是在第一行中的 where 子句。 这就是你如何过滤记录集请求。

所以,现在你可以读写表了。我们完成了,对吗?别着急。现在看起来我们会得到所有用户的记录。哪里有代码可以限制记录到特定用户?事实上,我在这里看不到任何特定于用户的内容。有什么可以阻止匿名用户尝试向我们的表添加数据?

很高兴你问了。当我们设置身份验证时,我们得到一个类似这样的代码片段。

client.currentUser !== null; 

这允许我们检查用户是否已登录(如果有人登录,则为 true;如果无人登录,则为 false)。这可以让我们在客户端进行一些过滤,但变量很容易被覆盖。这可能会导致对我们数据的攻击。这表明解决方案需要是服务器端的,事实上,在本例中就是这样。如果你转到你的表,你会看到一个叫做“脚本”的选项,如下所示。

正如你可能注意到的,你的脚本和我看起来不同。我添加了以下行。

item.userId = user.userId; 

这一行所做的是为插入的每条记录添加用户 ID。现在我知道所有插入的记录在进入之前都会被准确标记。我怎么知道每位尝试插入记录的用户都会有一个用户 ID?嗯,还记得我们创建表时,我们被问及每个 CRUD 操作应该有什么权限级别吗?我确保该特定表的每个操作都需要身份验证。现在,因为有了这个额外的代码片段,我将始终拥有一个经过服务器验证且未被篡改的值。  接下来,我在读取选项(通过下拉菜单更改为读取)上添加了类似的一行。

query.where({ userId: user.userId }); 

这一行确保我们只读取与该特定用户相关的记录。这就是我如何确定用户是否在 signup 列表中有条目的。

就是这样。我用一些 JavaScript 进行了所有这些代码的连接,然后就完成了。你可以通过访问校园分类信息网站并转到任何活动来看到这项工作的成果。首先,它会告诉你你需要先登录才能报名(我目前只使用了 Google 身份验证)。登录后,页面将更改,并提供报名选项。只需点击按钮即可报名。你的基本信息(来自你的登录)将存储在表中。现在如果你回到网站,它会记住你是谁(如果你已登录),并且会告诉你你已经报名参加了该活动。

你可以在这里尝试一下: http://samplecc.azurewebsites.net/Service/Item/4 

结论

好吧,我写了这篇两部分的文章,所以我的结论也将分为两部分。在 Azure 方面,结论很简单:Azure 太棒了!如果你看不到 Azure 的潜力,你的眼睛肯定闭着。Azure 的强大功能、灵活性、可伸缩性和易于上手使其成为一个全能的赢家。我经常批评微软的文档,但他们在 Azure 文档方面做得非常出色。当然,有些地方可以扩展或改进,但这些是例外,而不是规则。 从个人角度来看,我迫不及待地想更深入地研究 Azure。

至于实践方面,我花了很多时间来创建校园分类信息。是的,这是一个我正在处理的真实项目。虽然我现在有一个工作的故事板,而不是一个真正的 alpha 或 beta 产品,但我对结果和潜力感到满意。当我最终得到一个可工作的产品时,我肯定会考虑将其托管在 Azure 上。可伸缩性确保我能够随着业务的增长而扩展网站(而不是提前扩展,这将为我省钱)。脚本化功能使我能够非常快速地启动新网站(包括测试网站和生产网站)。每个新计划都有许多需要克服的问题,但我认为托管不是其中之一。我知道我可以依靠 Azure 来支持我。 

© . All rights reserved.