Azure REST API (2) Azure Storage

简介:

 《Windows Azure Platform 系列文章目录

 

  注意:本文适用于国内由世纪互联运维的Azure China。

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

  项目文件在这里下载

 

  1.首先我们以管理员身份,创建一个Windows Console项目

  2.在Program.cs中,增加如下代码

复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace AzureStorageRestAPI
{
    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 = @"https://leidemo.blob.core.chinacloudapi.cn";
        const string accountname = "leidemo";
        const string key = "EZNbnhPJ7+Fv6X5k9OW36ece5WflDJaUvGjdVpdwxEXsKVzEa18/Rw2f30d6ASELNYE7XlvFs78nfCw+UIs3kQ==";
        const string method = "GET";

        static void Main(string[] args)
        {
            string AccountName = accountname;
            string AccountSharedKey = key;
            string Address = bloburi;
            string container = "public";


            // 创建请求字符串
            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;

        }

    }
}
复制代码

  

  3.在调试项目的时候,注意修改以下参数:

  const string bloburi = @"https://leidemo.blob.core.chinacloudapi.cn";       //修改为Storage Endpoint

  const string accountname = "leidemo";                       //修改为你的存储账号名称

  const string key = "[YourStorageAccountKey]";                   //修改为你的存储账号Key

  string container = "public";                                //修改为存储账号的Container Name        

 

 

  4.运行成功,你将会看到Console程序输出如下信息,内容为名为存储账号leidemo,Container为public中所有Blob的信息:

 

  参考资料:http://blogs.msdn.com/b/azchina/archive/2010/03/19/windows-azure-rest-api-storage-service.aspx

 


本文转自Lei Zhang博客园博客,原文链接:http://www.cnblogs.com/threestone/p/4742214.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
API 网络安全 网络架构
【Azure APIM】解答REST API实现"禁用自签名证书的证书链验证"中的backends参数值从那里取值的问题?
本文介绍APIM服务调用后端API时因自签名证书导致500错误的解决方案。通过REST API禁用证书链验证,关键在于获取正确的backendId(即APIM中配置的Backend名称),并调用PATCH接口设置validateCertificateChain为false,从而解决SSL/TLS信任问题。
146 6
|
6月前
|
XML 安全 API
【Azure APIM】API Management的Policy是否支持 SAML assertion?
本文探讨了API Management是否支持通过策略(如validate-jwt)验证SAML assertion的问题。结论是API Management目前不支持SAML assertion验证,因其为XML-based token,而validate-jwt仅适用于JWT tokens。文章进一步介绍了SAML(安全断言标记语言)的基本原理、Assertion的组成及用途,包括单点登录(SSO)、跨组织身份验证、云服务集成和安全性增强等方面,帮助读者深入了解SAML的工作机制及其应用场景。
112 23
|
3月前
|
API 网络架构 容器
【Azure Container App】查看当前 Container App Environment 中的 CPU 使用情况的API
在扩展 Azure Container Apps 副本时,因 Container App Environment 的 CPU 核心数已达上限(500 cores),导致扩展失败。本文介绍如何使用 `az rest` 命令调用 Azure China Cloud 管理 API,查询当前环境的 CPU 使用情况,并提供具体操作步骤及示例。
144 16
|
3月前
|
安全 API 数据安全/隐私保护
【Azure 环境】Microsoft Graph API实现对Entra ID中应用生成密码的时间天数
本文介绍如何通过 Azure 的 App Management Policy 限制用户在创建 AAD 应用程序的 Client Secret 时设置最长 90 天的有效期。通过 Microsoft Graph API 配置 defaultAppManagementPolicy,可有效控制密码凭据的生命周期,增强安全管理。
128 4
|
12月前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
147 10
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
153 11
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
存储 API 开发工具
详说Azure的服务运行时API
详说Azure的服务运行时API  【版权声明】原创,作者为chszs,转载需注明。 一、服务运行时API简介   微软的Windows Azure服务总线提供了一整套REST风格的API,其中包括服务运行时API(Service Runtime API)和服务管理API(Service Management API),分别用于运行时操作和管理操作。
900 0
|
存储 API 开发工具
详说Azure的服务运行时API
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/7851794 详说Azure的服务运行时API  【版权声明】原创,作者为chszs,转载需注明。
799 0