Aracılığıyla paylaş


Paylaşılan Anahtar yetkilendirmesiyle REST API işlemlerini çağırma

Bu makalede, C# kullanarak yetkili bir REST isteği oluşturarak Azure Depolama REST API işleminin nasıl çağrıldığı gösterilmektedir. Blob Depolama için REST API işlemini çağırmayı öğrendikkten sonra, diğer tüm Azure Depolama REST işlemleri için benzer adımları kullanabilirsiniz.

Ön koşullar

Örnek uygulama, bir depolama hesabı için blob kapsayıcılarını listeler. Bu makaledeki kodu denemek için aşağıdaki öğelere ihtiyacınız vardır:

  • Visual Studio'yu yükleyin ve Azure geliştirme iş yükünü ekleyin. Bu örnek Visual Studio 2019 kullanılarak oluşturulmuştu. Farklı bir sürüm kullanıyorsanız kılavuz biraz farklılık gösterebilir.

  • Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

  • Genel amaçlı bir depolama hesabı. Henüz bir depolama hesabınız yoksa bkz . Depolama hesabı oluşturma.

  • Bu makaledeki örnekte, bir depolama hesabındaki kapsayıcıların nasıl liste adı verilmektedir. Çıktıyı görmek için başlamadan önce depolama hesabına bazı blob kapsayıcıları ekleyin.

Örnek uygulamayı indirin:

Örnek uygulama, C# dilinde yazılmış bir konsol uygulamasıdır.

Uygulamanın bir kopyasını geliştirme ortamınıza indirmek içi Git’i kullanın.

git clone https://github.com/Azure-Samples/storage-dotnet-rest-api-with-auth.git

Bu komut, depoyu yerel Git klasörünüze kopyalar. Visual Studio çözümünü açmak için storage-dotnet-rest-api-with-auth klasörüne gidin ve Depolama RestApiAuth.sln dosyasını açın.

REST hakkında

Temsili Durum Aktarımı (REST), HTTP/HTTPS gibi bir internet protokolü üzerinden bir hizmetle etkileşim kurmanızı sağlayan bir mimaridir. REST, sunucuda veya istemcide çalışan yazılımdan bağımsızdır. REST API, HTTP/HTTPS destekleyen herhangi bir platformdan çağrılabilir. Mac, Windows, Linux, Android telefon veya tablet, i Telefon, iPod veya web sitesinde çalışan bir uygulama yazabilir ve tüm bu platformlar için aynı REST API'yi kullanabilirsiniz.

REST API çağrısı, istemci tarafından yapılan bir istekten ve hizmet tarafından döndürülen yanıtlardan oluşur. İstekte, çağırmak istediğiniz işlem, üzerinde işlem gerçekleştirilecek kaynak, sorgu parametreleri ve üst bilgiler ve çağrılan işleme bağlı olarak veri yükü bilgilerini içeren bir URL gönderirsiniz. Hizmetten gelen yanıt bir durum kodu, bir dizi yanıt üst bilgisi ve çağrılan işleme bağlı olarak bir veri yükü içerir.

Örnek uygulama hakkında

Örnek uygulama, bir depolama hesabındaki kapsayıcıları listeler. REST API belgelerindeki bilgilerin gerçek kodunuzla nasıl bağıntılı olduğunu anladıktan sonra diğer REST çağrılarını daha kolay anlayabilirsiniz.

Blob Hizmeti REST API'sine bakarsanız blob depolamada gerçekleştirebileceğiniz tüm işlemleri görürsünüz. Depolama istemci kitaplıkları REST API'lerinin etrafındaki sarmalayıcılardır ve rest API'leri doğrudan kullanmadan depolama kaynaklarına erişmeyi kolaylaştırır. Ancak bazen depolama istemci kitaplığı yerine REST API kullanmak isteyebilirsiniz.

Kapsayıcıları Listeleme işlemi

Bu makale, Liste Kapsayıcıları işlemine odaklanır. Aşağıdaki bilgiler, istek ve yanıttaki bazı alanları anlamanıza yardımcı olur.

İstek Yöntemi: GET. Bu fiil, istek nesnesinin özelliği olarak belirttiğiniz HTTP yöntemidir. Bu fiilin diğer değerleri, çağırdığınız API'ye bağlı olarak HEAD, PUT ve DELETE değerlerini içerir.

İstek URI'si: https://myaccount.blob.core.windows.net/?comp=list. İstek URI'si blob depolama hesabı uç noktasından https://myaccount.blob.core.windows.net ve kaynak dizesinden /?comp=listoluşturulur.

URI parametreleri: ListContainers'ı çağırırken kullanabileceğiniz ek sorgu parametreleri vardır. Bu parametrelerin birkaçı, filtreleme için kullanılan çağrı (saniye) ve ön ek için zaman aşımıdır.

Bir diğer yararlı parametre de maxresults parametresidir: Bu değerden daha fazla kapsayıcı varsa, yanıt gövdesi sonraki istekte döndürülecek bir sonraki kapsayıcıyı gösteren bir NextMarker öğesi içerir. Bu özelliği kullanmak için, sonraki isteği yaptığınızda URI'de işaretleyici parametresi olarak NextMarker değerini sağlarsınız. Bu özellik kullanıldığında, sonuçlar arasında sayfalama ile benzerdir.

Ek parametreler kullanmak için, bunları kaynak dizesine aşağıdaki örnekte olduğu gibi değeriyle ekleyin:

/?comp=list&timeout=60&maxresults=100

İstek Üst Bilgileri: Bu bölümde gerekli ve isteğe bağlı istek üst bilgileri listelenir. Üst bilgilerden üçü gereklidir: Yetkilendirme üst bilgisi, x-ms-date (isteğin UTC saatini içerir) ve x-ms-version (kullanılacak REST API sürümünü belirtir). Üst bilgilerde x-ms-client-request-id eklendiğinde isteğe bağlıdır. Bu alanın değerini herhangi bir değere ayarlayabilirsiniz ve günlük etkinleştirildiğinde depolama analizi günlüklerine yazılır.

İstek Gövdesi: ListContainers için istek gövdesi yok. İstek Gövdesi, SetContainerAccessPolicy de dahil olmak üzere blobları karşıya yüklerken tüm PUT işlemlerinde kullanılır. İstek Gövdesi, uygulanacak depolanmış erişim ilkelerinin XML listesini göndermenizi sağlar. Depolanan erişim ilkeleri, Paylaşılan Erişim İmzalarını (SAS) Kullanma makalesinde ele alınmaktadır.

Yanıt Durum Kodu: Bilmeniz gereken durum kodlarını bildirir. Bu örnekte, 200 http durum kodu tamamdır. HTTP durum kodlarının tam listesi için Durum Kodu Tanımları'na bakın. Depolama REST API'lerine özgü hata kodlarını görmek için bkz. Ortak REST API hata kodları

Yanıt Üst Bilgileri: İçerik Türü;geçirilen istek kimliği olan x-ms-request-id; kullanılan Blob hizmetinin sürümünü gösteren x-ms-version ve UTC olan ve isteğin hangi saatte yapıldığını belirten Tarih.

Yanıt Gövdesi: Bu alan, istenen verileri sağlayan bir XML yapısıdır. Bu örnekte, yanıt kapsayıcıların ve bunların özelliklerinin listesidir.

REST isteği oluşturma

Üretimde çalışırken güvenlik için her zaman HTTP yerine HTTPS kullanın. Bu alıştırmanın amaçları doğrultusunda, istek ve yanıt verilerini görüntüleyebilmeniz için HTTP kullanıyoruz. Gerçek REST çağrılarında istek ve yanıt bilgilerini görüntülemek için Fiddler'ı veya benzer bir uygulamayı indirebilirsiniz. Visual Studio çözümünde, depolama hesabı adı ve anahtarı sınıfında sabit olarak kodlanır. ListContainersAsyncREST yöntemi, depolama hesabı adını ve depolama hesabı anahtarını REST isteğinin çeşitli bileşenlerini oluşturmak için kullanılan yöntemlere geçirir. Gerçek bir uygulamada depolama hesabı adı ve anahtarı bir yapılandırma dosyasında, ortam değişkenlerinde yer alır veya Azure Key Vault'tan alınabilir.

Örnek projemizde Yetkilendirme üst bilgisini oluşturma kodu ayrı bir sınıfta yer alır. Fikir, sınıfın tamamını alıp kendi çözümünüze ekleyip "olduğu gibi" kullanabilmenizdir. Yetkilendirme üst bilgi kodu, Azure Depolama'a yapılan ÇOĞU REST API çağrısında çalışır.

HttpRequestMessage nesnesi olan isteği oluşturmak için Program.cs dosyasında ListContainersAsyncREST bölümüne gidin. İstek oluşturma adımları şunlardır:

  • Hizmeti çağırmak için kullanılacak URI'yi oluşturun.
  • HttpRequestMessage nesnesini oluşturun ve yükü ayarlayın. Hiçbir şey geçirmediğimizden ListContainersAsyncREST için yük null.
  • x-ms-date ve x-ms-version için istek üst bilgilerini ekleyin.
  • Yetkilendirme üst bilgisini alın ve ekleyin.

İhtiyacınız olan bazı temel bilgiler:

  • ListContainers için yöntemi şeklindedir GET. İstek örneği oluşturulurken bu değer ayarlanır.
  • Kaynak, URI'nin hangi API'nin çağrıldığını gösteren sorgu bölümüdür, dolayısıyla değeri olur/?comp=list. Daha önce belirtildiği gibi kaynak, ListContainers API'sine ilişkin bilgileri gösteren başvuru belgeleri sayfasındadır.
  • URI, söz konusu depolama hesabı için Blob hizmet uç noktası oluşturulup kaynağın birleştirilmesiyle oluşturulur. İstek URI'sinin değeri olurhttp://contosorest.blob.core.windows.net/?comp=list.
  • ListContainers için requestBody null olur ve ek üst bilgi yoktur.

Farklı API'lerin geçirmek için ifMatch gibi başka parametreleri olabilir. PutBlob çağrılırken ifMatch işlevini kullanabileceğiniz bir örnektir. Bu durumda ifMatch değerini bir eTag olarak ayarlarsınız ve yalnızca sağladığınız eTag blob üzerindeki geçerli eTag ile eşleşiyorsa blobu güncelleştirir. eTag alındığından bu yana başka biri blobu güncelleştirdiyse, değişikliği geçersiz kılınmaz.

İlk olarak ve requestPayloaddeğerini ayarlayınuri.

// Construct the URI. It will look like this:
//   https://myaccount.blob.core.windows.net/resource
String uri = string.Format("http://{0}.blob.core.windows.net?comp=list", storageAccountName);

// Provide the appropriate payload, in this case null.
//   we're not passing anything in.
Byte[] requestPayload = null;

Ardından, yöntemini GET olarak ayarlayıp URI'yi sağlayarak isteğin örneğini oluşturun.

// Instantiate the request message with a null payload.
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
{ Content = (requestPayload == null) ? null : new ByteArrayContent(requestPayload) })
{

ve x-ms-versioniçin x-ms-date istek üst bilgilerini ekleyin. Koddaki bu yer, arama için gereken ek istek üst bilgilerini de eklediğiniz yerdir. Bu örnekte ek üst bilgi yoktur. Kapsayıcı ACL'sini Ayarla işlemi, ek üst bilgiler geçiren bir API örneğidir. Bu API çağrısı , "x-ms-blob-public-access" adlı bir üst bilgi ve erişim düzeyi değeri ekler.

// Add the request headers for x-ms-date and x-ms-version.
DateTime now = DateTime.UtcNow;
httpRequestMessage.Headers.Add("x-ms-date", now.ToString("R", CultureInfo.InvariantCulture));
httpRequestMessage.Headers.Add("x-ms-version", "2017-07-29");
// If you need any additional headers, add them here before creating
//   the authorization header.

Yetkilendirme üst bilgisini oluşturan yöntemini çağırın ve istek üst bilgilerine ekleyin. Yetkilendirme üst bilgisi makalenin ilerleyen bölümlerinde oluşturulur. Yöntem adı GetAuthorizationHeader'dır ve bu kod parçacığında görebilirsiniz:

// Get the authorization header and add it.
httpRequestMessage.Headers.Authorization = AzureStorageAuthenticationHelper.GetAuthorizationHeader(
    storageAccountName, storageAccountKey, now, httpRequestMessage);

Bu noktada, httpRequestMessage yetkilendirme üst bilgileriyle birlikte tamamlanan REST isteğini içerir.

İsteği gönderme

artık isteği oluşturduğunuza göre SendAsync yöntemini çağırarak Azure Depolama'a gönderebilirsiniz. Yanıt durum kodunun değerinin 200 olduğundan emin olun; bu da işlemin başarılı olduğu anlamına gelir. Ardından yanıtı ayrıştırın. Bu durumda, kapsayıcıların XML listesini alırsınız. Şimdi isteği oluşturmak, isteği yürütmek ve ardından kapsayıcı listesinin yanıtını incelemek için GetRESTRequest yöntemini çağırmak için koda bakalım.

    // Send the request.
    using (HttpResponseMessage httpResponseMessage =
      await new HttpClient().SendAsync(httpRequestMessage, cancellationToken))
    {
        // If successful (status code = 200),
        //   parse the XML response for the container names.
        if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
        {
            String xmlString = await httpResponseMessage.Content.ReadAsStringAsync();
            XElement x = XElement.Parse(xmlString);
            foreach (XElement container in x.Element("Containers").Elements("Container"))
            {
                Console.WriteLine("Container name = {0}", container.Element("Name").Value);
            }
        }
    }
}

SendAsync çağrısı yaparken Fiddler gibi bir ağ algılayıcısı çalıştırırsanız, istek ve yanıt bilgilerini görebilirsiniz. Bir göz atalım. Depolama hesabının adı contosorest'tir.

Istek:

GET /?comp=list HTTP/1.1

İstek Üst Bilgileri:

x-ms-date: Thu, 16 Nov 2017 23:34:04 GMT
x-ms-version: 2014-02-14
Authorization: SharedKey contosorest:1dVlYJWWJAOSHTCPGiwdX1rOS8B4fenYP/VrU0LfzQk=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive

Yürütmeden sonra döndürülen durum kodu ve yanıt üst bilgileri:

HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 3e889876-001e-0039-6a3a-5f4396000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 00:23:42 GMT
Content-Length: 1511

Yanıt gövdesi (XML): Kapsayıcıları Listele işlemi için kapsayıcıların listesini ve bunların özelliklerini gösterir.

<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
  ServiceEndpoint="http://contosorest.blob.core.windows.net/">
  <Containers>
    <Container>
      <Name>container-1</Name>
      <Properties>
        <Last-Modified>Thu, 16 Mar 2017 22:39:48 GMT</Last-Modified>
        <Etag>"0x8D46CBD5A7C301D"</Etag>
        <LeaseStatus>unlocked</LeaseStatus>
        <LeaseState>available</LeaseState>
      </Properties>
    </Container>
    <Container>
      <Name>container-2</Name>
      <Properties>
        <Last-Modified>Thu, 16 Mar 2017 22:40:50 GMT</Last-Modified>
        <Etag>"0x8D46CBD7F49E9BD"</Etag>
        <LeaseStatus>unlocked</LeaseStatus>
        <LeaseState>available</LeaseState>
      </Properties>
    </Container>
    <Container>
      <Name>container-3</Name>
      <Properties>
        <Last-Modified>Thu, 16 Mar 2017 22:41:10 GMT</Last-Modified>
        <Etag>"0x8D46CBD8B243D68"</Etag>
        <LeaseStatus>unlocked</LeaseStatus>
        <LeaseState>available</LeaseState>
      </Properties>
    </Container>
    <Container>
      <Name>container-4</Name>
      <Properties>
        <Last-Modified>Thu, 16 Mar 2017 22:41:25 GMT</Last-Modified>
        <Etag>"0x8D46CBD93FED46F"</Etag>
        <LeaseStatus>unlocked</LeaseStatus>
        <LeaseState>available</LeaseState>
        </Properties>
      </Container>
      <Container>
        <Name>container-5</Name>
        <Properties>
          <Last-Modified>Thu, 16 Mar 2017 22:41:39 GMT</Last-Modified>
          <Etag>"0x8D46CBD9C762815"</Etag>
          <LeaseStatus>unlocked</LeaseStatus>
          <LeaseState>available</LeaseState>
        </Properties>
      </Container>
  </Containers>
  <NextMarker />
</EnumerationResults>

artık isteği oluşturma, hizmeti çağırma ve sonuçları ayrıştırma hakkında bilgi edindiğinize göre yetkilendirme üst bilgisinin nasıl oluşturulacağını görelim.

Yetkilendirme üst bilgisi oluşturma

Bahşiş

Azure Depolama bloblar ve kuyruklar için Microsoft Entra tümleştirmesini destekler. Microsoft Entra ID, Azure Depolama isteği yetkilendirmek için çok daha basit bir deneyim sunar. REST işlemlerini yetkilendirmek için Microsoft Entra Id kullanma hakkında daha fazla bilgi için bkz . Microsoft Entra Id ile yetkilendirme. Azure Depolama ile Microsoft Entra tümleştirmesine genel bakış için bkz. Microsoft Entra Id kullanarak Azure Depolama erişimi kimlik doğrulaması.

Yetkilendirme kavramları hakkında daha fazla bilgi edinmek için bkz. Azure Depolama istekleri yetkilendirme.

Şimdi bu makaleyi tam olarak gerekli olduğu şekilde dağıtalım ve kodu gösterelim.

İlk olarak, Paylaşılan Anahtar yetkilendirmesini kullanın. Yetkilendirme üst bilgisi biçimi şöyle görünür:

Authorization="SharedKey <storage account name>:<signature>"  

İmza alanı, istekten oluşturulan ve SHA256 algoritması kullanılarak hesaplanan ve ardından Base64 kodlaması kullanılarak kodlanan Karma Tabanlı İleti Kimlik Doğrulama Kodudur (HMAC).

Bu kod parçacığı Paylaşılan Anahtar imza dizesinin biçimini gösterir:

StringToSign = VERB + "\n" +  
               Content-Encoding + "\n" +  
               Content-Language + "\n" +  
               Content-Length + "\n" +  
               Content-MD5 + "\n" +  
               Content-Type + "\n" +  
               Date + "\n" +  
               If-Modified-Since + "\n" +  
               If-Match + "\n" +  
               If-None-Match + "\n" +  
               If-Unmodified-Since + "\n" +  
               Range + "\n" +  
               CanonicalizedHeaders +  
               CanonicalizedResource;  

Blob depolama için VERB, md5, içerik uzunluğu, Kurallı Üst Bilgiler ve Kurallı Hale Getirilmiş Kaynak'ı belirtirsiniz. Bu örnekte diğerlerini boş bırakabilirsiniz, ancak boş olduklarını belirtmek için içine koyabilirsiniz \n .

Kurallı hale getirme, birden fazla olası gösterimi olan verileri standartlaştırma işlemidir. Bu durumda, üst bilgileri ve kaynağı standartlaştırıyorsunuz. Kurallı üst bilgiler , "x-ms-" ile başlayan üst bilgilerdir. Kurallı hale getirilmiş kaynak, depolama hesabı adı ve tüm sorgu parametreleri (gibi ?comp=list) dahil olmak üzere kaynağın URI'sidir. Kurallı hale getirilmiş kaynak, örneğin gibi timeout=60, eklemiş olabileceğiniz ek sorgu parametrelerini de içerir.

Yetkilendirme üst bilgisini oluşturmaları gerektiğinden iki kurallı alanla başlayalım.

Kurallı üst bilgiler

Bu değeri oluşturmak için, "x-ms-" ile başlayan üst bilgileri alın ve sıralayın, sonra bunları tek bir dizede birleştirilmiş bir örnek dizesi [key:value\n] olarak biçimlendirin. Bu örnekte kurallı üst bilgiler aşağıdaki gibi görünür:

x-ms-date:Fri, 17 Nov 2017 00:44:48 GMT\nx-ms-version:2017-07-29\n

Bu çıkışı oluşturmak için kullanılan kod şu şekildedir:

private static string GetCanonicalizedHeaders(HttpRequestMessage httpRequestMessage)
{
    var headers = from kvp in httpRequestMessage.Headers
        where kvp.Key.StartsWith("x-ms-", StringComparison.OrdinalIgnoreCase)
        orderby kvp.Key
        select new { Key = kvp.Key.ToLowerInvariant(), kvp.Value };

    StringBuilder headersBuilder = new StringBuilder();

    foreach (var kvp in headers)
    {
        headersBuilder.Append(kvp.Key);
        char separator = ':';

        // Get the value for each header, strip out \r\n if found, then append it with the key.
        foreach (string headerValue in kvp.Value)
        {
            string trimmedValue = headerValue.TrimStart().Replace("\r\n", string.Empty);
            headersBuilder.Append(separator).Append(trimmedValue);

            // Set this to a comma; this will only be used
            // if there are multiple values for one of the headers.
            separator = ',';
        }

        headersBuilder.Append("\n");
    }

    return headersBuilder.ToString();
}

Kurallı hale getirilmiş kaynak

İmza dizesinin bu bölümü, isteğin hedeflediği depolama hesabını temsil eder. İstek URI'sinin gerçek hesap adıyla (contosorestbu örnekte) olduğunu http://contosorest.blob.core.windows.net/?comp=listunutmayın. Bu örnekte, bu döndürülür:

/contosorest/\ncomp:list

Sorgu parametreleriniz varsa, bu örnek bu parametreleri de içerir. Birden çok değer içeren ek sorgu parametrelerini ve sorgu parametrelerini de işleyen kod aşağıdadır. Bu kodu tüm REST API'ler için çalışacak şekilde oluşturduğunuzu unutmayın. ListContainers yönteminin tümüne gerek duymasa bile tüm olasılıkları dahil etmek istiyorsunuz.

private static string GetCanonicalizedResource(Uri address, string storageAccountName)
{
    // The absolute path will be "/" because for we're getting a list of containers.
    StringBuilder sb = new StringBuilder("/").Append(storageAccountName).Append(address.AbsolutePath);

    // Address.Query is the resource, such as "?comp=list".
    // This ends up with a NameValueCollection with 1 entry having key=comp, value=list.
    // It will have more entries if you have more query parameters.
    NameValueCollection values = HttpUtility.ParseQueryString(address.Query);

    foreach (var item in values.AllKeys.OrderBy(k => k))
    {
        sb.Append('\n').Append(item.ToLower()).Append(':').Append(values[item]);
    }

    return sb.ToString();
}

Kurallı hale getirilmiş dizeler ayarlandıklarına göre yetkilendirme üst bilgisinin nasıl oluşturulacağını görelim. bu makalede daha önce görüntülenen StringToSign biçiminde bir ileti imzası dizesi oluşturarak başlarsınız. Bu kavram, koddaki açıklamaları kullanarak açıklamak daha kolaydır, bu nedenle Burada, Yetkilendirme Üst Bilgisini döndüren son yöntemdir:

internal static AuthenticationHeaderValue GetAuthorizationHeader(
    string storageAccountName, string storageAccountKey, DateTime now,
    HttpRequestMessage httpRequestMessage, string ifMatch = "", string md5 = "")
{
    // This is the raw representation of the message signature.
    HttpMethod method = httpRequestMessage.Method;
    String MessageSignature = String.Format("{0}\n\n\n{1}\n{5}\n\n\n\n{2}\n\n\n\n{3}{4}",
                method.ToString(),
                (method == HttpMethod.Get || method == HttpMethod.Head) ? String.Empty
                  : httpRequestMessage.Content.Headers.ContentLength.ToString(),
                ifMatch,
                GetCanonicalizedHeaders(httpRequestMessage),
                GetCanonicalizedResource(httpRequestMessage.RequestUri, storageAccountName),
                md5);

    // Now turn it into a byte array.
    byte[] SignatureBytes = Encoding.UTF8.GetBytes(MessageSignature);

    // Create the HMACSHA256 version of the storage key.
    HMACSHA256 SHA256 = new HMACSHA256(Convert.FromBase64String(storageAccountKey));

    // Compute the hash of the SignatureBytes and convert it to a base64 string.
    string signature = Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes));

    // This is the actual header that will be added to the list of request headers.
    AuthenticationHeaderValue authHV = new AuthenticationHeaderValue("SharedKey",
        storageAccountName + ":" + signature);
    return authHV;
}

Bu kodu çalıştırdığınızda, sonuçta elde edilen MessageSignature şu örneğe benzer:

GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 01:07:37 GMT\nx-ms-version:2017-07-29\n/contosorest/\ncomp:list

AuthorizationHeader için son değer aşağıdadır:

SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=

AuthorizationHeader, yanıtı göndermeden önce istek üst bilgilerine yerleştirilen son üst bilgidir.

Bu, Depolama Hizmetleri REST API'lerini çağırma isteği oluşturabileceğiniz bir sınıfı bir araya getirmek için bilmeniz gereken her şeyi kapsar.

Örnek: Blobları listeleme

Şimdi kapsayıcı kapsayıcısı-1 için List Blobs işlemini çağırmak için kodu nasıl değiştireceğini görelim. Bu kod, kapsayıcıları listeleme koduyla neredeyse aynıdır; tek fark URI ve yanıtı nasıl ayrıştırdığınızdır.

ListBlobs için başvuru belgelerine bakarsanız yönteminin GET ve RequestURI'sinin şu olduğunu fark edersiniz:

https://myaccount.blob.core.windows.net/container-1?restype=container&comp=list

ListContainersAsyncREST'de, URI'yi ListBlobs api'sine ayarlayan kodu değiştirin. Kapsayıcı adı container-1'dir.

String uri =
    string.Format("http://{0}.blob.core.windows.net/container-1?restype=container&comp=list",
      storageAccountName);

Ardından yanıtı işleyebileceğiniz yerde, kapsayıcılar yerine blobları aramak için kodu değiştirin.

foreach (XElement container in x.Element("Blobs").Elements("Blob"))
{
    Console.WriteLine("Blob name = {0}", container.Element("Name").Value);
}

Bu örneği çalıştırdığınızda aşağıdaki gibi sonuçlar alırsınız:

Kurallı üst bilgiler:

x-ms-date:Fri, 17 Nov 2017 05:16:48 GMT\nx-ms-version:2017-07-29\n

Kurallı hale getirilmiş kaynak:

/contosorest/container-1\ncomp:list\nrestype:container

İleti imzası:

GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 05:16:48 GMT
  \nx-ms-version:2017-07-29\n/contosorest/container-1\ncomp:list\nrestype:container

Yetkilendirme üst bilgisi:

SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=

Aşağıdaki değerler Fiddler'dan alınıyor:

Istek:

GET http://contosorest.blob.core.windows.net/container-1?restype=container&comp=list HTTP/1.1

İstek Üst Bilgileri:

x-ms-date: Fri, 17 Nov 2017 05:16:48 GMT
x-ms-version: 2017-07-29
Authorization: SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive

Yürütmeden sonra döndürülen durum kodu ve yanıt üst bilgileri:

HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 7e9316da-001e-0037-4063-5faf9d000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 05:20:21 GMT
Content-Length: 1135

Yanıt gövdesi (XML): Bu XML yanıtı blobların listesini ve bunların özelliklerini gösterir.

<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
    ServiceEndpoint="http://contosorest.blob.core.windows.net/" ContainerName="container-1">
    <Blobs>
        <Blob>
            <Name>DogInCatTree.png</Name>
            <Properties><Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
            <Etag>0x8D52D5C4A4C96B0</Etag>
            <Content-Length>419416</Content-Length>
            <Content-Type>image/png</Content-Type>
            <Content-Encoding />
            <Content-Language />
            <Content-MD5 />
            <Cache-Control />
            <Content-Disposition />
            <BlobType>BlockBlob</BlobType>
            <LeaseStatus>unlocked</LeaseStatus>
            <LeaseState>available</LeaseState>
            <ServerEncrypted>true</ServerEncrypted>
            </Properties>
        </Blob>
        <Blob>
            <Name>GuyEyeingOreos.png</Name>
            <Properties>
                <Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
                <Etag>0x8D52D5C4A25A6F6</Etag>
                <Content-Length>167464</Content-Length>
                <Content-Type>image/png</Content-Type>
                <Content-Encoding />
                <Content-Language />
                <Content-MD5 />
                <Cache-Control />
                <Content-Disposition />
                <BlobType>BlockBlob</BlobType>
                <LeaseStatus>unlocked</LeaseStatus>
                <LeaseState>available</LeaseState>
                <ServerEncrypted>true</ServerEncrypted>
            </Properties>
            </Blob>
        </Blobs>
    <NextMarker />
</EnumerationResults>

Özet

Bu makalede blob depolama REST API'sine nasıl istekte bulunabileceğinizi öğrendiniz. İstekle, kapsayıcıların listesini veya kapsayıcıdaki blobların listesini alabilirsiniz. REST API çağrısı için yetkilendirme imzası oluşturmayı ve REST isteğinde kullanmayı öğrendiniz. Son olarak yanıtı incelemeyi öğrendinsiniz.

Sonraki adımlar