`
bk_lin
  • 浏览: 346523 次
社区版块
存档分类
最新评论

Windows Azure入门教学系列 (七):使用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”。弹出如下图所示的窗口:

我们要关注的是 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的信息:

分享到:
评论

相关推荐

    Windows Azure使用入门 第二课:建立自己的网站.pdf

    ### Windows Azure 使用入门:建立自己的网站 #### 一、Windows Azure 中的网站概念 随着互联网技术的发展,网站已经成为企业和组织对外展示形象、提供服务的重要窗口。传统的网站搭建往往需要自行购买服务器、...

    Windows Azure入门教学系列

    Windows Azure 入门教学系列 本教程系列旨在帮助初学者快速入门 Windows Azure 平台,学习如何创建、部署和管理云端应用程序。通过本系列教程,读者将了解 Windows Azure 的基本概念、开发工具和部署流程。 知识点...

    Windows Azure使用入门 第七课:云端存储和管理数据.pdf

    ### Windows Azure 使用入门 第七课:云端存储和管理数据 #### Windows Azure 存储概述 在当今这个数据驱动的时代,随着数据量的爆炸性增长,企业和个人面临着如何有效存储、管理和利用这些数据的巨大挑战。微软的...

    Windows Azure使用入门 第一课:创建虚拟机.pdf

    ### Windows Azure 使用入门:创建虚拟机 #### 一、Windows Azure 虚拟机概述 在探讨如何在 Windows Azure 平台上创建虚拟机之前,我们首先需要了解什么是 Windows Azure 虚拟机以及它为何重要。 **Windows Azure...

    Windows Azure使用入门 第四课:开发测试在云中.pdf

    ### Windows Azure 使用入门 第四课:开发测试在云中 #### 一、Windows Azure 提供的应用程序服务 Windows Azure 是由微软推出的面向公有云的应用程序平台,在中国大陆区域(不包含香港、澳门特别行政区以及台湾...

    Windows Azure使用入门 第五课:用户认证上下打通.pdf

    ### Windows Azure 使用入门:用户认证上下打通 #### Azure AD 的管理与用户认证 在深入了解《Windows Azure 使用入门 第五课:用户认证上下打通》的内容之前,我们先回顾一下Windows Azure作为一个全面的云服务...

    Azure使用Rest访问存储服务的例子

    本篇文章将详细讲解如何利用REST API来访问Azure的Blob、队列和表存储服务。 首先,Azure存储服务是微软云平台提供的一种分布式、高可用的数据存储解决方案。它支持多种数据类型,包括Blob(对象存储)、Queue...

    Windows Azure使用入门 第十课:云端实现媒体点播与直播传送.pdf

    ### Windows Azure 使用入门第十课:云端实现媒体点播与直播传送 #### 一、Windows Azure 媒体服务概述 Windows Azure 媒体服务(现称为 Azure Media Services)是微软提供的一种云服务,用于帮助视频服务提供商...

    Windows Azure使用入门 第八课:云端备份和灾难恢复.pdf

    ### Windows Azure 使用入门 第八课:云端备份和灾难恢复 #### 一、Windows Azure 备份服务概述 在数字化时代,企业的核心竞争力往往体现在其所掌握的数据价值上。因此,确保这些宝贵数据的安全至关重要。传统的...

    Windows Azure使用入门 第三课:创建云端的数据库.pdf

    ### Windows Azure 使用入门 第三课:创建云端的数据库 #### Windows Azure 中的数据库概述 Windows Azure(现称为Azure)作为微软推出的云服务平台,为企业和个人提供了丰富的云计算资源和服务。其中,数据库服务...

    Windows Azure使用入门 第六课:运行开源软件与系统.pdf

    ### Windows Azure 使用入门第六课:运行开源软件与系统 #### 运行开源操作系统 随着云计算技术的不断发展,Microsoft 的 Windows Azure 平台逐渐成为一个能够支持多种操作系统和开发环境的强大平台。这一章节主要...

    《Windows Azure入门指南》

    **Windows Azure 入门指南** Windows Azure,现称为Microsoft Azure,是微软提供的一个全面的云计算平台,为企业和个人开发者提供了一套强大的工具和服务,用于构建、部署和管理应用程序和数据。本指南将引领初学者...

    Windows Azure使用入门 第九课:开发移动应用和通知发送.pdf

    ### Windows Azure 使用入门 第九课:开发移动应用和通知发送 #### Windows Azure 中的移动服务是什么? Windows Azure 是微软提供的一套全面的公有云服务平台,它不仅支持各种应用程序和服务的构建、部署与管理,...

    Windows Azure从入门到精通含源代码

    “Windows Azure从入门到精通含源代码”这本书很可能包含了实际示例,帮助读者通过实践理解Azure的用法。书中的源代码可能涵盖了如何使用Azure SDK进行开发,以及如何部署和管理应用程序。通过阅读和运行这些代码,...

    走进云计算Windows Azure实战手记光盘

    Queue存储服务与应用程序问通信、云上的关系数据库:SQL Azure、云上的访问控制技术:AppFabric Access Control、云服务的集散中心:AppFabric Service Bus、Windows Azure与其他平台的互操作性、云计算与Windows ...

    Microsoft.WindowsAzure.Storage-7.2.1.0

    《Microsoft.WindowsAzure.Storage SDK 7.2.1.0:深入了解云存储的基石》 Microsoft.WindowsAzure.Storage 是微软为开发者提供的一个关键库,用于与 Azure 存储服务进行交互,包括 Blob 存储、表存储、队列存储以及...

    azure-rest-api-specs, 微软Azure的REST API 规范源代码.zip

    azure-rest-api-specs, 微软Azure的REST API 规范源代码 Azure REST API 规范描述这个存储库是微软Azure的REST API 规范的规范源。新闻在假期期间,我们将对 Azure REST API 规范知识库进行一些改进:我们将停止合并...

    Windows.Azure从入门到精通

    《Windows Azure从入门到精通》是一本全面介绍微软云服务平台Windows Azure的指南,旨在帮助初学者快速理解和掌握Azure的核心概念和技术。通过本书,读者可以深入理解云计算的基础,以及如何利用Azure构建、部署和...

    REST API 在Azure上应用的简单通讯录 源码

    这是一个REST API 在Azure上应用的简单通讯录例子。 运行环境 VS2015 并安装 Azure App Service Tools V2.9软件包。已经有Azure账号。 使用方法: 第一步: 建立 API 服务器端 打开 ContactsList.API, 鼠标右键 ...

    Windows Azure快速入门——为什么选择Windows Azure

    ### Windows Azure 快速入门 —— 为什么选择 Windows Azure? #### Windows Azure 是什么? Windows Azure,作为微软的云服务平台,提供了广泛的服务,旨在帮助企业轻松搭建、部署并管理各种解决方案,几乎能满足...

Global site tag (gtag.js) - Google Analytics