2017-03-08 3 views
1

Der folgende Code, wenn sie auf einem echten Azure-Speicherkonto wies die Fleckinhaltsaktualisierer erfolgreich zurück:Wie verwende ich den Azure-Speicheremulator-Blob-Endpunkt, um einen Blob zu erhalten?

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(); 
} 

Allerdings, wenn ich es so konfigurieren, die Azure-Emulator zu verwenden, wo:

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

Ich verwende ich Azure Storage Emulator v4.6 immer 404. bekommen. Ist der Code oder die Konfiguration falsch oder wird dies nicht vom Emulator unterstützt?

Antwort

0

Es gibt zwei Probleme mit Ihrem Code:

  1. Blob Service im Speicher Emulator bei http://127.0.0.1:1000 hört jedoch die Basis-URI http://127.0.0.1:1000/devstoreaccount1 ist.
  2. Bei der Berechnung von Signature String (header Variable in Ihrem Code) muss der Kontoname zweimal angezeigt werden. Dies liegt daran, dass der Kontoname Teil des URI-Pfads Ihrer Ressource ist (die URL für das Blob wäre http://127.0.0.1:1000/devstoreaccount1/container-name/blob-name).

auf diese Basierend, versuchen Sie den folgenden Code:

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; 
     } 
    } 
+0

Dank. Ich sehe, was ich falsch gemacht habe. –

Verwandte Themen