暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

windows azure入门教学

原创 yBmZlQzJ 2023-09-04
192

Cover

Table of Contents

前言

第 1 章 Windows Azure平台简介

定位与产品结构

Windows Azure

AppFabric

SQL Azure以及其他服务

第 2 章 Windows Azure入门教学系列

创建第一个WebRole程序

部署第一个 Web Role 程序

创建第一个Worker Role程序

使用Blob Storage

使用Queue Storage

使用Table Storage

使用REST API访问Storage Service

使用Windows Azure Drive

前言

Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。本专栏提供一系列 Windows Azure入门学习文章。

适用人群

本教程是面向正准备学习Windows Azure基础知识学习者。

致谢
内容来源:http://blogs.msdn.com/b/azchina/

更新日期

更新内容

2015-06-12

Windows Azure入门教学系列

1

Windows Azure平台简介

定位与产品结构

定位

首先我们来看一看Windows Azure平台在微软产品大家族中的定位,并且把它和大家所熟悉的产品作个比较。

2.1.jpg

由上图可知,无论你的目标面向的是桌面,是服务器,还是云,我们都为你们提供了统一的开发和管理模式。

Windows Azure,正如同桌面操作系统Windows和服务器操作系统Windows Server一样,是一个云端的操作系统。

SQL Server是我们的服务器数据库产品,而SQL Azure则是我们的云端数据库产品。AppFabric作为中间件层,将起到连接非云端程序与云端程序的桥梁的功能。

开发人员可以使用同一套技术:.NET(包括Silverlight),或者Win32,同时针对桌面,服务器,以及云,开发程序,而不需要针对某个平台学习专门的技术。Visual Studio和Expression Studio为开发人员提供了强大的工具支持。

产品结构 接下来,我们来看看Windows Azure平台自身的产品结构。

2.2.jpg

上图中,最底层的是Windows Azure这个操作系统。它提供了Compute(计算),Storage(存储),以及Manage(管理)这三个主要功能。此外,还有对用户而言透明的Fabric。Fabric包含负载平衡,硬件抽象,等众多功能。然而一般而言,用户并不需要了解Fabric内部是如何工作的,就可以充分利用Windows Azure的各种特性。

在这之上,我们还提供了中间件产品AppFabric,数据库产品SQL Azure,以及其他一些building block产品,例如目前处于CTP阶段的Dallas。开发人员可以直接在Windows Azure之上进行开发,也可以利用AppFabric,SQL Azure等产品的各种特性。

Windows Azure

计算

Windows Azure的计算功能可以这样被使用:

作为一个部署服务的平台

用户可以在Windows Azure上部署自行开发的服务,例如使用WCF开发的Web Service,使用WF开发的工作流,使用ASP.NET开发的运行在服务器上的网站,等等。

作为一个软件分发平台

用户可以使用Windows Azure来分发自己的软件,例如0点击(无需用户操作)部属的Silverlight,XBAP,AJAX程序,但点击(Click Once)部署的WPF和Windows Forms程序,甚至是提供一个安装包的下载链接。当然,为了充分利用云的特性,这些软件常常需要和部署在云端的服务进行交互。

作为一个一般的分布式计算平台

Windows Azure也可以作为一个一般的分布式计算平台来使用。Fabric提供了极其强大的负载平衡的支持,所以可以很好的执行一些极为复杂的并行算法。Windows Azure支持多种开发技术,例如.NET,Win32,甚至是Java,从而满足大多数客户对分布式计算的需求。

针对开发人员,Windows Azure提供了一种叫做role的概念。每个role就可以被认为是一段程序,只是这段程序可以同时在一台或者多台机体上运行。每个role可以有多个实例(instance),每个实例就对应一台虚拟机。对同一个role而言,它所有的实例执行的程序都是相同的。

当前我们提供了两种类型的role,分别是Web Role和Worker Role。通常Web Role被用于部属服务以及分发软件,Worker Role则被用于执行分布式计算。

管理员可以很轻松的通过修改配置文件的方式来管理每个role需要运行几个实例。运行多个实例可以让你的程序更快地处理请求和执行任务,但是也意味着你需要支付更多的费用。当你不再需要那么多的计算资源的时候,你可以通过修改配置文件来减少实例的数量,从而支付较少的租金。这也正是云计算的一大优势,如果不使用云计算,你必须自行购买大量的硬件来处理更多的请求和执行更多的任务,当你不再需要那么多的计算资源的时候,这些硬件也就白白浪费在那里了。

存储

Windows Azure提供了四种存储服务:

Blob

初学者可以把blob比作文件系统。是的,它确实和文件系统有非常多的相似之处。Blob storage有两个概念:

  • Container:可以类比成文件夹
  • Blob:可以类比成文件

和文件系统一样,用户可以针对每个container设置访问权限,可以对某个blob进行加锁(lease)从而防止concurrency问题,还可以使用诸如创建,删除,复制,备份,等众多功能。

从存储结构上来说,我们提供了两种类型的blob:

  • Block blob:其存储方式类似于传统的文件系统中的簇(cluster)的概念。一个blob被分成一个或多个block进行存储。
  • Page blob:Page blob对随机读写进行了优化,大家可以把它类比成大型文件,例如.vhd和.mdf文件。

Table

千万不要把table storage和关系型数据库混淆起来。Windows Azure的table storage提供了一种结构化的存储方式。通俗来说,一个table可以被想象成一个xml文件。在xml文件中我们存放各种各样的数据,在一个table中我们也可以存放各种各样的entity。同一个table可以存储结构完全不同的两个entity,这和关系型数据库中需要对每张表制定统一的schema是不同的。

Table storage的可变的schema充分体现出了其灵活性。例如,你的业务需要扩展,需要往数据结构中添加新的字段,你可以在完全不修改table schema,完全不影响现有entity的情况下,对新的entity添加新的字段。如果你的程序可以被二次开发,第三方开发人员也完全可以在不影响你的程序所需要的entity的情况下,在同一张表中存储他们的程序所需要的,结构不同的entity。

Queue

Queue提供了一种先进先出的存储方式。它通常被用于各种不同的程序间的通信。例如一个经典的应用场景:Web Role接受用户请求,针对每个请求,在一个queue中创建一条消息(message)。Worker Role则不断的从queue中取出消息,并且一一处理。

Drive

目前尚处于beta阶段的drive storage让开发人员能够使用标准的NTFS API读写文件。一个drive可以被挂接(mount)到某个特定的实例上,当作该实例对应的虚拟机的一块硬盘使用。由于drive在后台是由page blob实现的,因此你往drive中写入的文件也会自动被写入后台的page blob。这样一来数据便得到了持久化,即使万一运行当前实例的虚拟机出了问题,你还可以在其它实例中再次挂接这块虚拟硬盘,数据并不会丢失。

需要注意的是,当前一个drive在同一时间只能被单个实例挂接。如果你需要在不同的实例中同时访问文件,还是推荐使用blob。Dive更常被用于移植现有的那些需要执行大量I/O操作的程序。

管理

管理员可以直接使用Windows Azure门户来管理他们的程序。门户提供了创建,删除项目,创建,删除,更新部署,等众多功能。此外,为了帮助大家更灵活地管理部署在Windows Azure上的程序,我们还提供了Management API,让开发人员自行开发程序来管理他们的部署。

今后,我们还会将System Center与Windows Azure集成,从而使得大家可以使用同一套工具,同时管理企业内部的服务器,以及云端的资产。

其他

Windows Azure还提供了诸多其他方面的功能,例如Diagnostics API等等。我们还在不停地更新这个平台。如果大家有什么好主意,欢迎用英文在http://www.mygreatwindowsazureidea.com/pages/34192-windows-azure-feature-voting上提出宝贵的建议。如果你觉得是用英文不方便,也可以直接在我们的博客上用中文留言,或者发邮件至afst@microsoft.com,我们会将你们的建议转达给产品组。

AppFabric

介绍完了操作系统,让我们再来看看操作系统之上的中间件。 Windows Azure 平台的中间件名叫 AppFabric 。它提供了两大服务:

Service Bus

Service Bus 可以被用于将本地的服务暴露给 Internet 。大多数的企业都拥有自己的局域网,为了解决 IP 地址不足的问题通常都设置了 NAT ,因此每台 server 对外都没有一个确定的地址。出于安全性考虑,防火墙往往都限制了大多数的端口。这就使得要在 Internet 上访问部署在本地的服务变得相当困难。

Service Bus 正是为了解决这一问题而产生的。 Service Bus 作为一个中间人,你的服务和客户端全都作为 Service Bus 的客户端与之进行交流。因为 Service Bus 不存在 NAT 问题,所以你的服务和客户端都很方便地能与之通信。 Service Bus 在最极端的场合下只需要你的服务器暴露 out bound 的 80 或 443 端口,换句话说,也就是你的服务器能够以 HTTP(S) 协议访问 Internet 。只要这样,你的服务就能连上 Service Bus 。因此,它对防火墙的要求可以说是相当低的。

Access Control

安全永远都是程序要需要考虑的第一要素,在云中,权限管理往往要比在企业内部来的困难。这是因为你无法直接使用诸如活动目录之类的产品来统一管理你的程序的访问控制。 Access Control 正是为了解决这一问题而产生的。

Access Control 支持 federated authentication 和 authorization 。例如,你可以要求你的用户通过企业内部的 Active Directory Federation Server (ADFS) 进行身份验证,使用他们的域帐号登录,将验证后的 claim 传给 Access Control ,然后根据预先在 Access Control 中设定的规则来给与或者否认他们访问你的服务和资源的权限。当然, Access Control 也支持各种其他的身份验证方式。通过对诸如 WRAP 和 SAML 之类的标准协议的支持, Access Control 体现出了良好的跨平台型。

其他

今后,我们也可能将现今 Windows Server AppFabric 中的功能移植到 Windows Azure platform AppFabric 中来。 Windows Server AppFabric 中的分布式缓存,以及 WCF/WF 管理的功能,都会对开发人员和管理员带来各式各样的益处。

SQL Azure以及其他服务

SQL Azure是一个部署在云端的关系型数据库引擎,它支持SQL Server中绝大多数和开发有关的功能。作为一个部署在云端的数据库引擎,绝大多数的管理工作都由微软为你完成,因此你不用担心任何诸如备份,集群,等管理方面的问题,我们的SLA (Service Level Agreement)确保了你的数据库服务器平均每个月将有99.99%的时间在线。也正是因为这点,目前我们暂时没有暴露太多的管理功能给用户。

开发人员可以使用现有的知识,例如ADO.NET Entity Framework (EDM),LINQ to SQL,甚至是传统的DataSet,ODBC等技术,来访问位于SQL Azure上的数据。绝大多数现有的数据访问程序只需要修改一个连接字符串,便能顺利访问SQL Azure。

SQL Server 2008 Management Studio R2(目前为CTP版本)针对SQL Azure也提供了很强大的支持。目前的CTP版本已经支持根据现有的数据库,生成能在SQL Azure上运行的T-SQL脚本,从而方便大家将数据库迁移至SQL Azure。今后的版本中会对SQL Azure提供更多更强大的支持。

其他

Windows Azure平台还会推出更多的服务供大家使用。例如,现在处于CTP阶段的Dallas,就是一个部署在云端的数据分析服务。它支持和常用的工具(例如Excel 2010的PowerPivot)结合起来使用,从而让用户能够使用自己所熟悉的工具来分析位于云端的数据。

2

Windows Azure入门教学系列

创建第一个WebRole程序

公告 :本博客为微软云计算中文博客的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问原博客

这是一系列 Windows Azure入门教学文章的第一篇。 在第一篇教学中,我们将学习如何在 Visual Studio 2010中创建一个 WebRole程序 (C#语言 )。

在开始本教学之前,请确保你从Windows Azure平台下载 下载并安装了最新的 Windows Azure开发工具。本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

以管理员权限打开 Visual Studio 2010,点击 File,选择 New,点击 Project按钮:

1.1.png

在弹出窗口中按照下图所示,选择 Windows Azure Project模板,命名项目为 FirstWebRole,点击 OK按钮创建项目 :

1.2.png

在弹出窗口出现后,按照下图所示,分别点击 ASP.NET Web Role, “ >”按钮。该步骤会在右边窗口中生成一个新的 WebRole项。点击 OK。

1.3.png

步骤二:观察生成的项目

项目结构如下图所示:

1.4.png

步骤三:运行程序

按 F5键开始调试程序。如果你是第一次运行 Windows Azure项目,你将会见到 Development Storage初始化的窗口,直接点击 OK按钮:

1.5.png

然后会见到下面的页面:

1.6.png

至此我们已经创建了第一个 WebRole程序。如果你留心的话,会发现任务栏里多了一个程序的图标,见下图:

1.7.png

这个就是 Windows Azure模拟器,让我们在本地测试自己的程序是否能够在 Windows Azure Platform上运行。通常情况下如果在本地测试通过的话便能够在 Windows Azure Platform上正常运行,但是也有一些例外情况。对于这些问题,我们会在以后的文章中详细介绍。

在这一教学系列的第二篇文章中,我们将会把这一程序发布到 Windows Azure Platform上,这样这个页面就能被互联网上任意用户访问了。

部署第一个 Web Role 程序

本文是 Windows Azure入门教学的第二篇文章。

在第一篇教学中,我们已经创建了第一个 Web Role 程序。在这篇教学中,我们将学习如何把该 Web Role 程序部署到云端。

注意:您需要购买 Windows Azure Platform 服务才能继续本教学。您可以通过点击https://mocp.microsoftonline.com/Site/Support.aspx页面上的

6.1.png

联系我们的支持团队来获得购买服务的具体步骤或询问其他有关购买,收费的问题。

在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的 Windows Azure 开发工具。 本教学使用 Visual Studio 2010 作为开发工具。

步骤一:在 Visual Studio 2010 中发布项目

在 Solution Explorer 窗口中,右击 FirstWebRole 项目,点击 Publish 选项:

6.2.png

在弹出来的 Windows Azure 项目部署窗口里,选择 Create Service Package Only 选项:

6.3.png

等待 Visual Studio 2010 创建压缩包完成后,我们将看到一个自动弹出的窗口指向压缩包和配置文件的路径 :

6.4.png

步骤二:进入 Windows Azure 管理站点

使用支持 SilverLight 的浏览器打开https://windows.azure.com/。 (注意:您可能需要输入您的 Live ID 和密码来通过身份验证 )

步骤三:创建新的 Hosted Service

由于是第一次部署,我们需要先创建一个 Hosted Service。点击 New Hosted Service 按钮:

6.5.png

在 Create a new Hosted Service 对话框里,在标记为 Choose a subscription 的下拉框里选择一个订阅选项:

6.6.png

在标记为 Enter a name for your service 的文本框里输入服务名称,在标记为 Enter a URL prefix for your service 的文本框里输入一个 URL前缀来指定它的 URL:

6.7.png

选择区域:

6.8.png

选择 Do Not Deploy。最后点击 OK 按钮完成创建:

6.9.png

步骤四:上传并部署程序压缩包

选中刚刚新建的 Hosted Service,然后点击 New Staging Deployment 按钮:

6.10.png

在打开的 Create a new Deployment 对话框里,通过点击两个 Browse Locally 按钮来选择刚刚生成的程序压缩包 FirstWebRole.cspkg 和配置文件 ServiceConfiguration.cscfg。在标记为 Deployment name 的文本框里输入一个标签来标记当前这次部署:

6.11.png

点击 OK 开始部署。一个警告对话框将会弹出来提示是否覆盖并提交,想了解详细信息,请点击 See more details 按钮:

6.12.png

点击 Yes开始覆盖并提交部署请求。

6.13.png

步骤五:在 Staging 环境下启动并测试程序

等待一段时间直到部署完成,这个过程将会耗费十几或几十分钟时间。部署完成后,我们就已经上传了程序压缩包并且它已经处于 Ready 的状态了。请注意管理工具给这个部署分配了一个 DNS 名称和一个唯一的标识。等下我们就可以通过这个 URL去访问并测试这个 Web Role程序了。

6.14.png

使用浏览器访问该部署的 URL来查看 Web Role 程序:

6.15.png

步骤六:将程序转移到 Production 环境

确认程序在 Staging 环境下成功运行之后,选中该部署,点击 Swap VIP 按钮:

6.16.png

在 Swap VIPs 对话框里,点击 OK 按钮开始将部署从 Staging 环境转换到 Production 环境 :

6.17.png

至此我们已经成功地把我们第一个 Web Role 程序发布到云端了!现在可以被任何能够访问 Internet 的机器访问了。

6.18.png

创建第一个Worker Role程序

本文是 Windows Azure入门教学的第三篇文章。

本文将会引导大家创建一个简单的 Worker Role 程序,并且部署在 Windows Azure模拟器 里。

在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

以管理员权限启动 Visual Studio 2010 ,并且新建一个 Windows Azure Project 项目。

7.1.png

在弹出窗口出现后,按照下图所示,分别点击 Worker Role , “ >” 按钮。该步骤会在右边窗口中生成一个新的 Worker Role 项。当你把鼠标移动至该 Worker Role 项之上时,会出现两个图标。 点击左边的铅笔图标,你就可以修改 Worker Role的名字;点击右边的叉形图标则可以移除该 Role。决定了 Role的种类,数量,以及名字之后,点击 OK以创建解决方案。

7.2.png

步骤二:观察并分析生成的项目

项目结构如下图所示:

7.3.png

其中自动被设置成启动项目的是一个 Cloud Service项目,你可以通过蓝色圆球图标来识别一个 Cloud Service项目。单纯的一个 Cloud Service项目只是一个 Role的载体,针对每个 Role, Visual Studio也会为你创建一个对应的项目,例如,为 Worker Role生成的就是一个 Class Library项目。无论何时,请确保 Cloud Service项目是启动项目。

打开 WorkerRole.cs文件,并且观察 WorkerRole类:

public class WorkerRole : RoleEntryPoint
 
{
 
public override void Run()
 
{
 
// This is a sample worker implementation. Replace with your logic.
 
Trace .WriteLine("SimpleWorkerRole entry point called" , "Information" );
 
 
 
while (true )
 
{
 
Thread .Sleep(10000);
 
Trace .WriteLine("Working" , "Information" );
 
}
 
}
 
 
 
public override bool OnStart()
 
{
 
// Set the maximum number of concurrent connections
 
ServicePointManager .DefaultConnectionLimit = 12;
 
 
 
// For information on handling configuration changes
 
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357 .
 
 
 
return base .OnStart();
 
}
 
}

每个 Worker Role 都包含一个 WorkerRole 类,作为程序的入口点,类似于 Console 项目中的 Program 类。这个类必须继承自 RoleEntryPoint ,并且必须被命名为 WorkerRole。

WorkerRole.OnStart 方法可以被类比成 Console 程序中的 Main 方法,它会在一个R ole 启动时被调用,通常被用于做一些初始化工作。默认生成的代码为你初始化了诊断( Diagnostics )以及配置相关的代码。

WorkerRole.Run 方法会在一个 Worker Role 初始化完毕,开始运行时被调用。 一旦 Run方法被跳出,一个 Worker Role就会被终止(你可以重写 OnStop方法来做一些善后工作,这个方法并没有被自动生成)。

通常 Worker Role被用于批量处理任务,所以自动生成的代码的控制逻辑中包含了一个无限循环,每个循环用于处理单个任务,在处理之前当前线程会睡上 10秒。请注意你并不一定要跟着自动生成的控制逻辑走,你完全可以修改生成的代码,来撰写你自己的控制逻辑。例如,你也许会创建一个定时器,每隔一定时间来执行一个任务。

本文假设你并未修改自动生成的代码,自动生成的代码执行的任务就是每隔 10秒纪录一条 Trace信息。

步骤三:运行程序

现在我们已经可以在 Windows Azure模拟器中运行这个 Worker Role程序了。在第一篇教学中,我们已经让大家认识了 Windows Azure模拟器,在今后的文章中还会有更详细的说明,这里省略相关内容。

按下 F5 开始调试程序,在任务栏中找到 Windows Azure模拟器 的图标,右键点击该图标,点击Show Compute Emulator UI打开UI界面。

项目启动后,每隔 10 秒,你都会看到一句 Information: Working 的消息,这就说明我们的 Worker Role 中在顺利运行中:

7.4.png

请注意发布之后观察 Trace信息的方式和在 Windows Azure模拟器中是不一样的。有关详细信息,我们会在今后的文章中说明。

使用Blob Storage

本文是 Windows Azure 入门教学 的第四篇文章。

本文将会介绍如何使用 Blob Storage。 Blob Storage可以看做是云端的文件系统。与桌面操作系统上不同,我们是通过 REST API来进行对文件的操作。有关 REST API的详细信息,请参见 Blob 服务 API

为了方便 .NET开发人员,我们在 SDK中提供了 Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求。

在开始本教学之前,请确保你从Windows Azure 平台下载 下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

由于我们要在本地模拟环境下测试 Blob Storage,首先,请确保 Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让 Visual Studio 2010帮助我们启动他。

右击工具栏中 Windows Azure模拟器的图标,选择” Show Storage Emulator UI”。弹出如下图所示的窗口:

8.1.png

我们要关注的是 Service management中 Blob所在的一行。要确保 Status为 Running。

确认完毕后启动 Visual Studio 2010,并且新建一个 Console项目。

步骤二:添加 SDK 程序集引用

请在项目属性页里确认项目的 Target framework的值是 .NET Framework 4或 .NET Framework 3.5。然后添加对 C:/Program Files/Windows Azure SDK/v1.3/ref/Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为 SDK默认安装路径,如果你不能在这个路径中找到 Microsoft.WindowsAzure.StorageClient.dll请从 SDK安装路径中寻找。

步骤三:添加代码

首先引用命名空间:

using Microsoft.WindowsAzure;
 
using Microsoft.WindowsAzure.StorageClient;
 
 
 
然后在 Main方法中加入如下代码:
 
 
 
static void Main(string [] args)
 
{
 
var storageAccount = CloudStorageAccount .DevelopmentStorageAccount;
 
var blobclient = storageAccount.CreateCloudBlobClient();
 
 
 
// 检查 container 是否被创建,如果没有,创建 container
 
var container = blobclient.GetContainerReference("helloworldcontainer" );
 
container.CreateIfNotExist();
 
 
 
// 新建一个 blob ,内容为 "Hello World"
 
var blob = container.GetBlobReference("myfile" );
 
blob.UploadText("Hello World!" );
 
 
 
// 读取并显示 blob 内容
 
var blobcontent = blob.DownloadText();
 
Console .WriteLine(blobcontent);
 
 
 
// 删除 blob
 
var succeed = blob.DeleteIfExists();
 
 
 
Console .WriteLine(succeed ? "Delete Succeed" : "Delete Failed" );
 
Console .ReadLine();
 
}

步骤四:观察并分析代码

步骤三中的代码中,首先我们通过 CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的 Development Storage自带账户而不是真正的云端存储服务账户。 (如果要用真实账户可以使用

//DefaultEndpointsProtocol=https 可以改成 DefaultEndpointsProtocol=http 表示用 HTTP 而不是 HTTPS
 
CloudStorageAccount .Parse("DefaultEndpointsProtocol=https;AccountName=[ 用户名 ];AccountKey=[ 密码 ]" );

来实例化对象 )然后通过该账户类来实例化一个 Blob客户端类。这两步是使用 SDK中 StorageClient程序集来调用 Blob Storage服务的必要步骤。接下来的代码逻辑可以分为四部分:

  • 检查 container是否被创建,如果没有,创建 container
  • 新建一个 blob,内容为 "Hello World"
  • 读取并显示 blob内容
  • 删除 blob

第一部分,我们得到一个 container的引用。就作用来说我们大致上可以把 container类比成是桌面操作系统中的文件夹。我们在得到引用后检查该 container是否存在。注意如果是用的真实账号,当调用 CreateIfNotExist()方法后就有 REST请求发出了。

后面几部分代码非常简单。我们可以看到 SDK提供给我们的 API是十分简单好用的。

步骤五:运行程序

按 F5调试程序。如果一切正常你将会看到输出的消息如下图所示:

8.2.png

步骤六:创建新的 Storage Account

使用支持 SilverLight的浏览器打开 https://windows.azure.com/。 (注意:您可能需要输入您的 Live ID和密码来通过身份验证 ) 点击 New Storage Account:

8.3.png

在 Create a New Storage Account对话框里,在标记为 Choose a subscription 的下拉框里选择一个订阅选项:

8.4.png

在标记为 Enter a URL的文本框里输入一个 URL前缀来指定它的 URL:

8.5.png

选择区域:

8.6.png

最后点击 Create按钮完成创建。等待创建过程完成后,我们可以看到系统给我们分配了 3个 URL,分别是 Blob URL、 Table URL和 Queue URL,以及刚才我们自己输入的用户名。

8.7.png

然后点击属性栏里的 Primary access key或者 Secondary access key可以看到这些 key的值。点击 View Storage Access Keys对话框里的 Copy to Clipboard按钮就可以拷贝到粘贴板里了。

8.8.png

步骤七:使用 Storage Account 运行程序

将代码里的 :

CloudStorageAccount .DevelopmentStorageAccount

替换成 :

CloudStorageAccount .Parse("DefaultEndpointsProtocol=https;AccountName=[ 用户名 ];AccountKey=[ 密码 ]" )

根据刚才创建的 Storage Account填入用户名和密码。最后运行程序的结果是一样的。但是这次用的是 Windows Azure上的 Blob Storage作为存储服务。

8.9.png

使用Queue Storage

本文是 Windows Azure 入门教学 的第五篇文章。

本文将会介绍如何使用 Queue Storage。 Queue Storage提供给我们一个云端的队列。我们可以用 Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。

一个使用 Queue Storage经典的场景是,在一个 Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间。这种情况下,服务器端通过 Queue Storage可以把用户递交的信息存储在队列中,后台再运行一个程序从队列中取得数据进行信息的处理。

以往如果程序时运行在 Windows操作系统上,那么我们可以使用MSMQ来做类似的工作。而 Queue Storage的出现为我们提供了另一种选择。特别是在非 Windows操作系统上,我们依然可以使用 Queue Storage的REST API来很方便地使用它。

有关 Queue Storage REST API的详细信息,请参见Queue 服务 API

为了方便 .NET开发人员,我们在 SDK中提供了 Microsoft.WindowsAzure.StorageClient类来帮助发送 REST请求。

在开始本教学之前,请确保你从Windows Azure 平台下载 下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

由于我们要在本地模拟环境下测试 Queue Storage,首先,请确保 Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让 Visual Studio 2010帮助我们启动他。

右击工具栏中 Windows Azure模拟器的图标,选择” Show Storage Emulator UI”。弹出如下图所示的窗口:

10.1.png

我们要关注的是 Service management中 Queue所在的一行。要确保 Status为 Running。

确认完毕后启动 Visual Studio 2010,并且新建两个 Console项目。我们将演示如何在一个 Console程序中往 Queue Storage中添加信息然后另外一个 Console程序如何读取并处理信息。

步骤二:添加 SDK 程序集引用

请在项目属性页里确认项目的 Target framework的值是 .NET Framework 4或 .NET Framework 3.5。然后在两个 Console项目中均添加 C:/Program Files/Windows Azure SDK/v1.3/ref/Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为 SDK默认安装路径,如果你不能在这个路径中找到 Microsoft.WindowsAzure.StorageClient.dll请从 SDK安装路径中寻找。

步骤三:添加代码

首先在两个项目中的 Program.cs中均引用命名空间:

using System.Threading;
 
using Microsoft.WindowsAzure;
 
using Microsoft.WindowsAzure.StorageClient;

然后在其中一个项目(为了叙述方便,后面称之为 Client项目)的 Main方法中加入如下代码,我们将用它来向 Queue Storage中添加信息。

static void Main(string [] args)
 
{
 
var storageAccount = CloudStorageAccount .DevelopmentStorageAccount;
 
var queueStorage = storageAccount.CreateCloudQueueClient();
 
 
 
// 检查名为 helloworldqueue 的队列是否被创建,如果没有,创建它
 
var queue = queueStorage.GetQueueReference("helloworldqueue" );
 
queue.CreateIfNotExist();
 
 
 
Console .WriteLine("Client is running..." );
 
 
 
while (true )
 
{
 
// 插入数据到队列中
 
queue.AddMessage(new CloudQueueMessage (string .Format("client sent information: {0}" , DateTime .UtcNow.ToString())));
 
 
 
// 每次插入数据后线程休息 3 秒
 
Thread .Sleep(3000);
 
}
 
}

接着在另外一个项目(为了叙述方便,后面称之为 Server项目)的 Main方法中加入如下代码,我们将用它来从 Queue Storage中读取信息和进行处理。

static void Main(string [] args)
 
{
 
var storageAccount = CloudStorageAccount .DevelopmentStorageAccount;
 
var queueStorage = storageAccount.CreateCloudQueueClient();
 
 
 
// 检查名为 helloworldqueue 的队列是否被创建,如果没有,创建它
 
var queue = queueStorage.GetQueueReference("helloworldqueue" );
 
queue.CreateIfNotExist();
 
 
 
Console .WriteLine("Server is running..." );
 
 
 
while (true )
 
{
 
// 从队列中读取一条信息
 
// 收到信息后可以根据收到的信息做处理,为了演示方便我们这里只是把信息显示出来
 
// 在云端发送消息后这条消息将对于后续的请求不可见,但是并未被删除。我们需要显示删除它。
 
// 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。
 
// 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。
 
// 详情请参考 MSDN 文档
 
var message = queue.GetMessage();
 
 
 
if (message != null )
 
{
 
Console .WriteLine(string .Format("Message retrieved: {0}" , message.AsString));
 
 
 
// 处理完数据后必须显示删除消息
 
queue.DeleteMessage(message);
 
}
 
 
 
// 每次读取数据后线程休息 3 秒
 
Thread .Sleep(3000);
 
}
 
}

步骤四:观察并分析代码

步骤三中的代码中,首先我们通过 CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的 Development Storage自带账户而不是真正的云端存储服务账户。 (如果要用真实账户可以使用

// DefaultEndpointsProtocol=https 可以改成 DefaultEndpointsProtocol=http 表示用 HTTP 而不是 HTTPS
 
CloudStorageAccount .Parse("DefaultEndpointsProtocol=https;AccountName=[ 用户名 ];AccountKey=[ 密码 ]" );

来实例化对象 )然后通过该账户类来实例化一个 Queue客户端类。这两步是使用 SDK中 StorageClient程序集来调用 Queue Storage服务的必要步骤。

Client项目中的代码相对简单。大约每隔 3秒向 Queue Storage中插入一条数据。 Server端的项目中我们则大约每隔 3秒从 Queue Storage中读取一条数据。处理完毕后将之删除。对于为什么必须在读取后显示删除的问题请参考注释部分。

步骤五:运行程序

先运行 Client程序然后运行 Server个程序。如果一切正常,你将会看到 Server项目的 Console程序输出收到的消息:

10.2.png

注意由于是本地模拟, Client和 Server程序需要要在同一台机器上运行。但是如果使用真实账户的话, Client和 Server程序就可以跨越机器进行通信了。

使用Table Storage

本文是 Windows Azure 入门教学 的第六篇文章。

本文将会介绍如何使用 Table Storage。 Table Storage提供给我们一个云端的表格结构。我们可以把他想象为 XML文件或者是一个轻量级的数据库(当然,不是通过 SQL 语句进行数据的操作)。

使用 Table Storage的方法依然是调用REST API。有关 Table Storage REST API的详细信息,请参见Table服务 API

为了方便 .NET开发人员,我们在 SDK中提供了 Microsoft.WindowsAzure.StorageClient类来帮助发送 REST请求。

在开始本教学之前,请确保你从Windows Azure 平台下载 下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

由于我们要在本地模拟环境下测试 Table Storage,首先,请确保 Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让 Visual Studio 2010帮助我们启动他。

右击工具栏中 Windows Azure模拟器的图标,选择” Show Storage Emulator UI”。弹出如下图所示的窗口:

11.1.png

我们要关注的是 Service management中 Table所在的一行。要确保 Status为 Running。

确认完毕后启动 Visual Studio 2010,并且新建一个 Console项目。

步骤二:添加程序集引用

请在项目属性页里确认项目的 Target framework的值是 .NET Framework 4或 .NET Framework 3.5。然后添加对 C:/Program Files/Windows Azure SDK/v1.3/ref/Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为 SDK默认安装路径,如果你不能在这个路径中找到 Microsoft.WindowsAzure.StorageClient.dll请从 SDK安装路径中寻找。

接下来添加对 System.Data.Services.Client程序集的引用。该程序集安装在 GAC中。你能够在 Add Reference窗口的 .NET标签下找到他。

步骤三:添加代码

首先在项目中的 Program.cs中引用命名空间:

using Microsoft.WindowsAzure;
 
using Microsoft.WindowsAzure.StorageClient;

然后在 Program.cs中添加如下代码 :

class Program
 
{
 
static void Main(string [] args)
 
{
 
var storageAccount = CloudStorageAccount .DevelopmentStorageAccount;
 
var tableStorage = storageAccount.CreateCloudTableClient();
 
 
 
// 检查名为 CustomerInfo 的表格是否被创建,如果没有,创建它
 
tableStorage.CreateTableIfNotExist("CustomerInfo" );
 
 
 
// 创建表格服务上下文
 
var context = new CustomerInfoContext (storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
 
 
 
// 插入两条客户信息数据 , 客户 ID 分别设置为 0 和 1
 
CustomerInfo ci1 = new CustomerInfo () { CustomerAge = 25, CustomerID = "0" , CustomerName = "Mike" };
 
context.AddObject("CustomerInfo" , ci1);
 
 
 
CustomerInfo ci2 = new CustomerInfo () { CustomerAge = 32, CustomerID = "1" , CustomerName = "Peter" };
 
context.AddObject("CustomerInfo" , ci2);
 
 
 
context.SaveChanges();
 
 
 
 
 
// 查找 CustomerID 为 1 的客户数据并显示
 
 
 
Console .WriteLine("Retrieve information of a customer whose ID is 1" );
 
 
 
var query = context.CreateQuery<CustomerInfo >("CustomerInfo" ).Where(c => c.CustomerID == "1" ).ToList();
 
var returnedcustomerinfo = query.FirstOrDefault();
 
 
 
Console .WriteLine(string .Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}" ,
 
returnedcustomerinfo.CustomerID, returnedcustomerinfo.CustomerName, returnedcustomerinfo.CustomerAge));
 
 
 
 
 
// 更新 CustomerID 为 1 的客户数据中的年龄
 
returnedcustomerinfo.CustomerAge = 33;
 
context.UpdateObject(returnedcustomerinfo);
 
Console .WriteLine("**Customer Info updated**" );
 
 
 
// 重新查询 , 测试更新效果
 
 
 
Console .WriteLine("Retrieve information of a customer whose ID is 1" );
 
 
 
var query2 = context.CreateQuery<CustomerInfo >("CustomerInfo" ).Where(c => c.CustomerID == "1" ).ToList();
 
var returnedcustomerinfo2 = query.FirstOrDefault();
 
Console .WriteLine(string .Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}" ,
 
returnedcustomerinfo2.CustomerID, returnedcustomerinfo2.CustomerName, returnedcustomerinfo2.CustomerAge));
 
 
 
 
 
// 删除插入的两条客户数据
 
context.DeleteObject(ci1);
 
context.DeleteObject(ci2);
 
context.SaveChanges();
 
 
 
Console .WriteLine("The records has been deleted" );
 
Console .ReadLine();
 
}
 
 
 
}
 
public class CustomerInfo : TableServiceEntity
 
{
 
public string CustomerID
 
{
 
get { return this .RowKey; }
 
set { this .RowKey = value ; }
 
}
 
public string CustomerName { get ; set ; }
 
public int CustomerAge { get ; set ; }
 
 
 
public CustomerInfo()
 
{
 
this .PartitionKey = "mypartitionkey" ;
 
}
 
}
 
 
 
public class CustomerInfoContext : TableServiceContext
 
{
 
public CustomerInfoContext(string baseAddress, StorageCredentials credentials) :
 
base (baseAddress, credentials)
 
{
 
}
 
}

步骤四:观察并分析代码

步骤三中的代码中,首先我们通过 CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的 Development Storage自带账户而不是真正的云端存储服务账户。 (如果要用真实账户可以使用

//DefaultEndpointsProtocol=https 可以改成 DefaultEndpointsProtocol=http 表示用 HTTP 而不是 HTTPS
 
CloudStorageAccount .Parse("DefaultEndpointsProtocol=https;AccountName=[ 用户名 ];AccountKey=[ 密码 ]" );

来实例化对象 )然后通过该账户类来实例化一个 Table客户端类。这两步是使用 SDK中 StorageClient程序集来调用 Table Storage服务的必要步骤。

然后我们需要关注 System.Data.Services.Client程序集。该程序集是 WCF Data Services的客户端程序集,能够帮助我们很方便地创建 OData客户端程序。 (Table Storage提供的 REST API遵循 OData规范,因此我们的客户端需要遵循 OData规范向 Table Storage服务发送消息 )

我们需要创建上下文来调用服务,我们可以直接使用 TableServiceContext。但是通常我们会通过写一个继承自 TableServiceContext的类来实现,这样我们可以在该类中添加一些属性或者方法来更加方便地调用。上面的代码中我们继承了 TableServiceContext但是并没有添加额外的代码。在实际应用中我们可以加上一些代码来更加方便地调用。比如我们可以在 CustomerInfoContext 类中加入下面的属性:

public IQueryable <CustomerInfo > CustomerInfo
 
{
 
get
 
{
 
return CreateQuery<CustomerInfo >("CustomerInfo" );
 
}
 
}

这样我们就可以通过调用 context.CustomerInfo来更加代替 context.CreateQuery("CustomerInfo")。

继承自 TableServiceEntity类的 CustomerInfo 类定义了每条数据的模式。需要注意的是,与一般的关系型数据库不同, Table Storage并不要求一个表中的所有数据都遵循同一模式。举例来说,在一个表中,可以存储一条有三个字段的记录和一条只有两个字段的记录。这也是我们为什么说可以把 Table Storage想象为 XML文件的原因。当然在通常情况下我们都会需要在一个表中存储同一模式的数据。这时候我们就可以使用 System.Data.Services.Client程序集来为 Table Storage创建客户端程序。当我们需要在一个表中存储不同模式的数据时我们可以手动构建和发送 REST请求。

还有需要注意的地方是 PartitionKey和 RowKey。这两项共同组合成表的主键。详细信息,请参见理解 Table服务数据模型

代码逻辑包括了对 Table Storage的插入,更新,删除和读取。请参考注释部分。

步骤五:运行程序

如果一切正常,你将会看到 Console程序输出如下信息:

11.2.png

使用REST API访问Storage Service

本文是 Windows Azure 入门教学 的第七篇文章。

本文将会介绍如何使用REST API来直接访问 Storage Service。

在前三篇教学中,我们已经学习了使用 Windows Azure SDK所提供的 StorageClient来使用 Blob Storage, Queue Storage以及 Table Storage的基本方法。我们在前几篇教学中也提及最终 StorageClient也是通过发送 REST请求来与服务器端通信的。

在这篇教学中,我们会以 Blob Storage为例,说明如何使用 REST API直接与服务器进行通信。需要说明的是,这篇教学中使用的是 C#语言。但是由于 REST API实际上是通过 HTTP发送的 HTTP消息,使用其他语言的工程师同样可以参考代码逻辑了解如何构造 HTTP消息以便在其他编程语言中使用。

在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:准备工作

在本教学中我们将使用 List Blobs API,欲了解详细信息,请参见List Blobs

该 API的作用是返回给定的 Container中的 Blob信息。为了测试我们的代码我们首先需要有一个已经创建的 Container并且向其中添加至少一个 Blob。由于如何添加 Container和 Blob的方法我们已经在 Windows Azure入门教学系列 (四 ):使用 Blob Storage 中提过,在此不赘述。读者可以按照 Windows Azure入门教学系列 (四 ):使用 Blob Storage 中的代码创建名为 helloworldcontainer的 Container和名为 myfile的 Blob。 (只需注释掉删除 Blob的代码并运行程序即可 )

步骤二:创建解决方案和项目

首先,请确保 Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让 Visual Studio 2010帮助我们启动他。

右击工具栏中 Windows Azure模拟器的图标,选择” Show Storage Emulator UI”。弹出如下图所示的窗口:

12.1.png

我们要关注的是 Service management中 Blob所在的一行。要确保 Status为 Running。

确认完毕后启动 Visual Studio 2010,并且新建一个 Console项目。

步骤三:添加程序集引用

请在项目属性页里确认项目的 Target framework的值是 .NET Framework 4或 .NET Framework 3.5。然后在 Console项目中添加对 System.Web程序集的引用。该程序集安装在 GAC中。在 .NET标签下能够找到该程序集。我们将使用该程序集来发送 HTTP请求和接受 HTTP消息。

步骤四:添加代码

首先在项目中的 Program.cs中引用命名空间:

using System.IO;
 
using System.Collections.Specialized;
 
using System.Collections;
 
using System.Web;
 
using System.Net;

然后在 Program.cs中添加如下代码 :

class Program
 
{
 
internal class CanonicalizedString
 
{
 
private StringBuilder canonicalizedString = new StringBuilder ();
 
 
 
internal CanonicalizedString(string initialElement)
 
{
 
this .canonicalizedString.Append(initialElement);
 
}
 
 
 
internal void AppendCanonicalizedElement(string element)
 
{
 
this .canonicalizedString.Append("/n" );
 
this .canonicalizedString.Append(element);
 
}
 
internal string Value
 
{
 
get
 
{
 
return this .canonicalizedString.ToString();
 
}
 
}
 
}
 
 
 
const string bloburi = @"http://127.0.0.1:10000/devstoreaccount1" ;
 
const string accountname = "devstoreaccount1" ;
 
const string key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" ;
 
const string method = "GET" ;
 
 
 
static void Main(string [] args)
 
{
 
string AccountName = accountname;
 
string AccountSharedKey = key;
 
string Address = bloburi;
 
string container = "helloworldcontainer" ;
 
 
 
// 创建请求字符串
 
string QueryString = "?restype=container&comp=list" ;
 
Uri requesturi = new Uri (Address + "/" + container + QueryString);
 
string MessageSignature = "" ;
 
 
 
// 创建 HttpWebRequest 类
 
HttpWebRequest Request = (HttpWebRequest )HttpWebRequest .Create(requesturi.AbsoluteUri);
 
Request.Method = method;
 
Request.ContentLength = 0;
 
Request.Headers.Add("x-ms-date" , DateTime .UtcNow.ToString("R" ));
 
Request.Headers.Add("x-ms-version" , "2009-09-19" );
 
 
 
// 开始创建签名
 
MessageSignature += "GET/n" ; // Verb
 
MessageSignature += "/n" ; // Content-Encoding
 
MessageSignature += "/n" ; // Content-Language
 
MessageSignature += "/n" ; // Content-Length
 
MessageSignature += "/n" ; // Content-MD5
 
MessageSignature += "/n" ; // Content-Type
 
MessageSignature += "/n" ; // Date
 
MessageSignature += "/n" ; // If-Modified-Since
 
MessageSignature += "/n" ; // If-Match
 
MessageSignature += "/n" ; // If-None-Match
 
MessageSignature += "/n" ; // If-Unmodified-Since
 
MessageSignature += "/n" ; // Range
 
 
 
// CanonicalizedHeaders
 
ArrayList list = new ArrayList ();
 
foreach (string str in Request.Headers.Keys)
 
{
 
if (str.ToLowerInvariant().StartsWith("x-ms-" , StringComparison .Ordinal))
 
{
 
list.Add(str.ToLowerInvariant());
 
}
 
}
 
list.Sort();
 
foreach (string str2 in list)
 
{
 
StringBuilder builder = new StringBuilder (str2);
 
string str3 = ":" ;
 
foreach (string str4 in GetHeaderValues(Request.Headers, str2))
 
{
 
string str5 = str4.Replace("/r/n" , string .Empty);
 
builder.Append(str3);
 
builder.Append(str5);
 
str3 = "," ;
 
}
 
MessageSignature += builder.ToString() + "/n" ;
 
}
 
MessageSignature += GetCanonicalizedResourceVersion2(requesturi, AccountName);
 
 
 
// 开始创建签名
 
byte [] SignatureBytes = System.Text.Encoding .UTF8.GetBytes(MessageSignature);
 
System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256 (Convert .FromBase64String(AccountSharedKey));
 
 
 
// 创建 Authorization HTTP 消息头的值
 
String AuthorizationHeader = "SharedKey " + AccountName + ":" + Convert .ToBase64String(SHA256.ComputeHash(SignatureBytes));
 
 
 
// 把编码后的签名加入到 Authorization HTTP 消息头中
 
Request.Headers.Add("Authorization" , AuthorizationHeader);
 
 
 
// 获取返回消息
 
using (HttpWebResponse response = (HttpWebResponse )Request.GetResponse())
 
{
 
if (response.StatusCode == HttpStatusCode .OK)
 
{
 
// 服务器返回成功消息
 
using (Stream stream = response.GetResponseStream())
 
{
 
using (StreamReader sr = new StreamReader (stream))
 
{
 
 
 
var s = sr.ReadToEnd();
 
// 输出返回消息
 
Console .WriteLine(s);
 
}
 
 
 
}
 
}
 
else
 
{
 
// 这里可以抛出异常信息
 
}
 
}
 
Console .ReadLine();
 
 
 
}
 
 
 
static ArrayList GetHeaderValues(NameValueCollection headers, string headerName)
 
{
 
ArrayList list = new ArrayList ();
 
string [] values = headers.GetValues(headerName);
 
if (values != null )
 
{
 
foreach (string str in values)
 
{
 
list.Add(str.TrimStart(new char [0]));
 
}
 
}
 
return list;
 
}
 
 
 
static string GetCanonicalizedResourceVersion2(Uri address, string accountName)
 
{
 
StringBuilder builder = new StringBuilder ("/" );
 
builder.Append(accountName);
 
builder.Append(address.AbsolutePath);
 
CanonicalizedString str = new CanonicalizedString (builder.ToString());
 
NameValueCollection values = HttpUtility .ParseQueryString(address.Query);
 
NameValueCollection values2 = new NameValueCollection ();
 
foreach (string str2 in values.Keys)
 
{
 
ArrayList list = new ArrayList (values.GetValues(str2));
 
list.Sort();
 
StringBuilder builder2 = new StringBuilder ();
 
foreach (object obj2 in list)
 
{
 
if (builder2.Length > 0)
 
{
 
builder2.Append("," );
 
}
 
builder2.Append(obj2.ToString());
 
}
 
values2.Add((str2 == null ) ? str2 : str2.ToLowerInvariant(), builder2.ToString());
 
}
 
ArrayList list2 = new ArrayList (values2.AllKeys);
 
list2.Sort();
 
foreach (string str3 in list2)
 
{
 
StringBuilder builder3 = new StringBuilder (string .Empty);
 
builder3.Append(str3);
 
builder3.Append(":" );
 
builder3.Append(values2[str3]);
 
str.AppendCanonicalizedElement(builder3.ToString());
 
}
 
return str.Value;
 
}
 
}

步骤五:观察并分析代码

我们首先观察下面三行代码:

const string bloburi = @"http://127.0.0.1:10000/devstoreaccount1" ;
 
const string accountname = "devstoreaccount1" ;
 
const string key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" ;

这三行代码定义了 Blob Storage服务端口,我们使用的账户名和密码。由于使用的是本地模拟的 Storage,所以必须使用固定的端口地址,用户名以及密码。可以参考Development Storage与 Windows Azure Storage Services的不同之处获取更多信息。

在代码中,我们使用 HttpWebRequest 构造并发送 HTTP请求。由于我们的例子中使用的是 List Blobs API我们需要查阅List Blobs对该 API的规定构造符合规定的 HTTP请求。

在规定中说明了如果该 container没有被设置为允许匿名访问,那么必须由于账户拥有者调用该 API才能返回结果。要这样做必须添加 Authorization HTTP消息头。我们必须严格按照Authentication Schemes规定的格式来生成该 HTTP消息头。

步骤六:运行程序

如果一切正常,你将会看到 Console程序输出如下信息,内容为名为 helloworld的 Container中所有 Blob的信息:

13.1.png

使用Windows Azure Drive

本文是 Windows Azure 入门教学 的第八篇文章。

本文将会介绍如何使用 Windows Azure Drive。

我们知道,由于云端的特殊性,通常情况下,对文件系统的读写建议使用 Blob Storage来代替。这就产生了一个问题:对于一个已经写好的本地应用程序,其中使用了 NTFS API对本地文件系统读写的代码是否需要进行完全重写以便迁移到 Windows Azure平台上呢?答案是否定的。 Windows Azure平台提供了 Drive的功能。

在 1.1版本的 SDK中提供了 CloudDrive类,能够将本地 NTFS文件系统 Mount到 Blob Storage上。我们只要添加一小段代码来表明我们希望 Mount Drive到 Blob Storage上就能重用大部分已有的对本地文件系统访问的代码。这样,我们已有的程序能够无缝地迁移到 Windows Azure上而不需要做大的改动。

在开始本教学之前,请确保你从Windows Azure 平台下载 下载并安装了最新的 Windows Azure开发工具。 本教学使用 Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目

由于我们要在本地模拟环境下测试 Windows Azure Drive,首先,请确保 Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让 Visual Studio 2010帮助我们启动他。

右击工具栏中 Windows Azure模拟器的图标,选择” Show Storage Emulator UI”。弹出如下图所示的窗口:

14.1.png

我们要关注的是 Service management中 Blob所在的一行。要确保 Status为 Running。

确认完毕后启动 Visual Studio 2010,新建一个 Cloud Service项目并为之添加一个 Web Role。

步骤二:添加 SDK 程序集引用

请在项目属性页里确认项目的 Target framework的值是 .NET Framework 4或 .NET Framework 3.5。然后在 Web Role项目中添加对 C:/Program Files/Windows Azure SDK/v1.3/ref/Microsoft.WindowsAzure.CloudDrive.dll的引用。该路径为 SDK默认安装路径,如果你不能在这个路径中找到 Microsoft.WindowsAzure.CloudDrive.dll请从 SDK安装路径中寻找。

步骤三:添加代码

删除并重新创建 Default.aspx 页面,然后在 Default.aspx.cs中引用命名空间:

using Microsoft.WindowsAzure;
 
using Microsoft.WindowsAzure.StorageClient;
 
using System.IO;

然后添加下列代码:

public partial class Default : System.Web.UI.Page
 
{
 
string _driveLetter = WebRole .DriveLetter;
 
 
 
protected void Page_Load(object sender, EventArgs e)
 
{
 
if (!IsPostBack)
 
{
 
Bind();
 
}
 
}
 
 
 
void Bind()
 
{
 
// 显示被 Mount 的 Drive 根目录下的所有文件
 
DirectoryInfo di = new DirectoryInfo (string .Format("{0}//" , _driveLetter));
 
this .GridView1.DataSource = di.GetFiles();
 
this .GridView1.DataBind();
 
}
 
 
 
protected void Button1_Click(object sender, EventArgs e)
 
{
 
// 在被 Mount 的 Drive 根目录下保存文件
 
if (this .FileUpload1.HasFile)
 
{
 
File .WriteAllBytes(string .Format("{0}//{1}" , _driveLetter, this .FileUpload1.FileName), this .FileUpload1.FileBytes);
 
Bind();
 
}
 
}
 
}

在 Default.aspx中添加下列代码:

< form id ="form1" runat ="server">
 
 
 
< asp : FileUpload ID ="FileUpload1" runat ="server" />
 
< asp : Button ID ="Button1" runat ="server" Text ="Upload" onclick ="Button1_Click" />
 
 
 
< asp : GridView AllowPaging ="true" PageSize ="20" ID ="GridView1" runat ="server">
 
</ asp : GridView >
 
 
 
</ form >

接下来在 WebRole.cs中引用命名空间:

using Microsoft.WindowsAzure.StorageClient;

然后添加下列代码:

public class WebRole : RoleEntryPoint
 
{
 
public static string DriveLetter { get ; private set ; }
 
CloudDrive myCloudDrive;
 
 
 
public override bool OnStart()
 
{
 
// 当用配置文件中 ConfigurationSettings 时必须调用 CloudStorageAccount.SetConfigurationSettingPublisher
 
// 来说明当配置文件在发布后被更改时将采取何种操作
 
CloudStorageAccount .SetConfigurationSettingPublisher((configName, configSetter) =>
 
{
 
 
 
configSetter(RoleEnvironment .GetConfigurationSettingValue(configName));
 
 
 
RoleEnvironment .Changed += (sender, arg) =>
 
{
 
if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange >()
 
.Any((change) => (change.ConfigurationSettingName == configName)))
 
{
 
 
 
if (!configSetter(RoleEnvironment .GetConfigurationSettingValue(configName)))
 
{
 
RoleEnvironment .RequestRecycle();
 
}
 
}
 
};
 
});
 
 
 
// For information on handling configuration changes
 
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
 
 
 
return base .OnStart();
 
}
 
 
 
public override void Run()
 
{
 
CloudStorageAccount storageAccount = CloudStorageAccount .FromConfigurationSetting("DataConnectionString" );
 
 
 
LocalResource localCache = RoleEnvironment .GetLocalResource("InstanceDriveCache" );
 
CloudDrive .InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes);
 
 
 
// 检查 Container 是否存在,不存在则创建
 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
 
blobClient.GetContainerReference("drives" ).CreateIfNotExist();
 
 
 
// 创建 Cloud Drive
 
myCloudDrive = storageAccount.CreateCloudDrive(
 
blobClient
 
.GetContainerReference("drives" )
 
.GetPageBlobReference("mydrive.vhd" )
 
.Uri.ToString()
 
);
 
 
 
try
 
{
 
myCloudDrive.Create(64);
 
 
 
}
 
catch (CloudDriveException )
 
{
 
 
 
}
 
DriveLetter = myCloudDrive.Mount(0, DriveMountOptions .Force);
 
 
 
base .Run();
 
}
 
 
 
public override void OnStop()
 
{
 
myCloudDrive.Unmount();
 
 
 
base .OnStop();
 
}
 
}

最后,修改配置文件。在 Cloud Service项目的 ServiceConfiguration.cscfg中添加下列配置:

<? xml version = "1.0 " encoding = "utf-8 "?>
 
< ServiceConfiguration serviceName = "WindowsAzureDriveDemonstration "xmlns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration " osFamily = "1 " osVersion = "* ">
 
< Role name = "WebRole1 ">
 
< Instances count = "1 " />
 
< ConfigurationSettings >
 
< Setting name = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString " value = "UseDevelopmentStorage=true " />
 
< Setting name = "DataConnectionString " value = "UseDevelopmentStorage=true " />
 
</ ConfigurationSettings >
 
</ Role >
 
</ ServiceConfiguration >

在 ServiceDefinition.csdef中添加下列配置(注意将 Sites部分的内容删除或注释掉):

<? xml version = "1.0 " encoding = "utf-8 "?>
 
< ServiceDefinition name = "WindowsAzureDriveDemonstration " xmlns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition ">
 
< WebRole name = "WebRole1 ">
 
< Sites >
 
< Site name = "Web ">
 
< Bindings >
 
< Binding name = "Endpoint1 " endpointName = "Endpoint1 " />
 
</ Bindings >
 
</ Site >
 
</ Sites >
 
< Endpoints >
 
< InputEndpoint name = "Endpoint1 " protocol = "http " port = "80 " />
 
</ Endpoints >
 
< Imports >
 
< Import moduleName = "Diagnostics " />
 
</ Imports >
 
< LocalResources >
 
< LocalStorage name = "InstanceDriveCache " cleanOnRoleRecycle = "false " sizeInMB = "300 " />
 
</ LocalResources >
 
< ConfigurationSettings >
 
< Setting name = "DataConnectionString " />
 
</ ConfigurationSettings >
 
</ WebRole >
 
</ ServiceDefinition >

步骤四:观察并分析代码

步骤三中的代码中, Default.aspx.cs的代码跟普通的 ASP.NET项目代码没什么区别。我们把盘符抽离出来以便迁移到 Windows Azure上。 Default.aspx.cs中的代码跟 Windows Azure唯一相关的一句语句就是 string driveLetter = WebRole .DriveLetter 。 我们如果把 WebRole .DriveLetter 替换为本机盘符该 ASP.NET程序将能够正常运行。

后面的代码示范了如何 Mount Drive到 Blob Storage。此外我们使用了本地缓存来缓存尚未被传递到 Blob Storage的文件。

通过上面的例子可以看到,只需额外添加一小段代码,已有的使用 NTFS API的程序能够很方便地迁移到 Windows Azure平台上。

步骤五:运行程序

运行程序。上传几个文件。如果一切顺利你将看到下图所示的结果。可以看到文件的 DirectoryName为“ a:/”。这就是被 Mount到 Blob Storage上的 Drive的盘符。

15.1.png

需要注意的是,本例中我们并未修改 WebRole的实例数,因此只有 1个 WebRole(发布到云端后将只有一个虚拟机被使用)。如果有两个实例,并且要让两个实例共享一个”网络硬盘“的话,本例中代码将不能正常工作。因为对于同一个 Blob同时只能有一个虚拟机 Mount。一个可能的解决方案是额外维护一个 Web Service来管理 Mount和 UnMount Drive。进一步的讨论超出了本教学的范围。有兴趣的读者可以下载并参考 Windows Azure Cloud Drive白皮书 获取信息。

jk_book.png

jk_weixin.png

更多信息请访问 book_view.png

http://wiki.jikexueyuan.com/project/windows-azure-getting-started/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论