zoukankan      html  css  js  c++  java
  • 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("
    ");
                    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
    "; // Verb
    
                MessageSignature += "
    "; // Content-Encoding
    
                MessageSignature += "
    "; // Content-Language
    
                MessageSignature += "
    "; // Content-Length
    
                MessageSignature += "
    "; // Content-MD5
    
                MessageSignature += "
    "; // Content-Type
    
                MessageSignature += "
    "; // Date
    
                MessageSignature += "
    "; // If-Modified-Since
    
                MessageSignature += "
    "; // If-Match
    
                MessageSignature += "
    "; // If-None-Match
    
                MessageSignature += "
    "; // If-Unmodified-Since
    
                MessageSignature += "
    "; // 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("
    ", string.Empty);
    
                        builder.Append(str3);
    
                        builder.Append(str5);
    
                        str3 = ",";
    
                    }
    
                    MessageSignature += builder.ToString() + "
    ";
    
                }
    
                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

  • 相关阅读:
    改进动物园
    异常动手脑总结
    代码大全2 阅读笔记
    抽象和接口
    Appium+python自动化2-启动百度app
    Appium+python自动化1-环境搭建
    python之图像识别
    python之栈和队列
    python之语音识别(speech模块)
    使用Python计算IP、TCP、UDP校验和
  • 原文地址:https://www.cnblogs.com/threestone/p/4742214.html
Copyright © 2011-2022 走看看