如何使用Azure存储模拟器blob端点获取blob?

时间:2017-03-08 16:53:39

标签: azure azure-storage-blobs azure-storage-emulator

以下代码在指向真正的Azure存储帐户时将成功返回blob内容:

var path = $"{container}/{blob}";
var rfcDate = DateTime.UtcNow.ToString("R");
var headers =  "GET\n\n\n\n\n\n\n\n\n\n\n\n" +
               "x-ms-blob-type:Block\n" +
              $"x-ms-date:{rfcDate}\n" + 
              $"x-ms-version:{ServiceVersion}\n" +
              $"/{AccountName}/{path}";
var uri = new Uri(BlobEndpoint + path);
var request = new HttpRequestMessage(HttpMethod.Get, uri);
request.Headers.Add("x-ms-blob-type", "Block");
request.Headers.Add("x-ms-date", rfcDate);
request.Headers.Add("x-ms-version", ServiceVersion);

string signature = "";
using (var sha = new HMACSHA256(System.Convert.FromBase64String(AccountKey)))
{
  var data = Encoding.UTF8.GetBytes(headers);
  signature = System.Convert.ToBase64String(sha.ComputeHash(data));
}

var authHeader = $"SharedKey {AccountName}:{signature}";
request.Headers.Add("Authorization", authHeader);

using (var client = new HttpClient())
{
  var response = await client.SendAsync(request);
  return await response.Content.ReadAsStringAsync();
}

但是,如果我将其配置为使用Azure模拟器,其中:

  • AccountName = devstoreaccount1
  • AccountKey = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq / K1SZFPTOtr / KBHBeksoGMGw ==
  • BlobEndpoint = http://127.0.0.1:10000/
  • ServiceVersion = 2009-09-19

我总是得到404.我使用的是Azure Storage Emulator v4.6。代码或配置是否不正确或模拟器不支持?

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

  1. 存储模拟器中的Blob服务侦听http://127.0.0.1:1000,但基URI为http://127.0.0.1:1000/devstoreaccount1
  2. 在计算代码中的Signature Stringheader变量)时,帐户名称必须出现两次。这是因为帐户名称是资源的URI路径的一部分(blob的URL将为http://127.0.0.1:1000/devstoreaccount1/container-name/blob-name)。
  3. 根据这些,请尝试以下代码:

        static async Task<string> ReadBlobFromDevStorage()
        {
            var container = "temp";
            var blob = "test.txt";
            var ServiceVersion = "2009-09-19";
            var AccountName = "devstoreaccount1";
            var BlobEndpoint = "http://127.0.0.1:10000/devstoreaccount1";
            var path = $"{container}/{blob}";
            var AccountKey = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
            var rfcDate = DateTime.UtcNow.ToString("R");
            var headers = "GET\n\n\n\n\n\n\n\n\n\n\n\n" +
                           "x-ms-blob-type:Block\n" +
                          $"x-ms-date:{rfcDate}\n" +
                          $"x-ms-version:{ServiceVersion}\n" +
                          $"/{AccountName}/{AccountName}/{path}";
            var uri = new Uri(BlobEndpoint + "/" + path);
            var request = new HttpRequestMessage(HttpMethod.Get, uri);
            request.Headers.Add("x-ms-blob-type", "Block");
            request.Headers.Add("x-ms-date", rfcDate);
            request.Headers.Add("x-ms-version", ServiceVersion);
    
            string signature = "";
            using (var sha = new HMACSHA256(System.Convert.FromBase64String(AccountKey)))
            {
                var data = Encoding.UTF8.GetBytes(headers);
                signature = System.Convert.ToBase64String(sha.ComputeHash(data));
            }
    
            var authHeader = $"SharedKey {AccountName}:{signature}";
            request.Headers.Add("Authorization", authHeader);
    
            using (var client = new HttpClient())
            {
                var response = await client.SendAsync(request);
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
                return content;
            }
        }