Windows Azure datalagring - Blobs

Introduktion till Windows Azure datalagring

I Windows Azure finns det tre erbjudanden för datalagring. Dessa tre erbjudanden går under namnen Blobs, Tables och Queues. Dessa tre har olika syften vilka jag kommer behandla i denna post och två kommande poster. Blobs, Tables och Queues kan användas var och en för sig, men säkerligen kommer du använda flera av dem i kombination för att lagra din tjänsts tillstånd och annan information.

Vad dessa tre lagringserbjudanden har gemensamt är att de är varaktiga, skalbara och högt tillgängliga. De familjära REST-gränssnitten medför att Blobs, Tables och Queues är åtkomliga från valfritt programmeringsspråk och plattform.

" - Han har glömt SQL Data Services" kanske du tänker. SQL Data Services är helt riktigt också en plats för datalagring i molnet. SQL Data Services är dock inte en del av Windows Azure. Windows Azure och SQL Data Services är båda medlemmar av vad som kallas Azure Services Platform.

Windows Azure Blob datalagring

Blob är en förkortning och står för Binary Large Object. En Blob är vanligtvis en bild, ett dokument, en film eller liknande men det kan i princip vara vilken typ av binär data som helst.

Det är denna typ av information som Windows Azure Blob Storage är gjort för att lagra.

I Windows Azure Blob Storage finns det tre huvudkoncept. Dessa är Account, Container och Blob. Det första, Account, är helt enkelt ditt Windows Azure Storage konto. Inom ditt konto kan du skapa Containers, i vilka du sparar dina Blobbar (Blobbar == Blobs). En Container inte kan inkludera ytterligare Containers. Vill du skapa ytterligare nivåer i din lagringsstruktur kan du göra detta genom att använda slash (/) i dina Blobnamn.

image

För att komma åt din Blob kan du skriva in adressen till den i din webbläsare enligt URI mönstret: https://{account}.blobs.core.windows.net/{container}/{blob}. För att ladda ned Pic1.jpg från ovan bild skulle adressen således bli https://chrislof.blobs.core.windows.net/Pictures/Pic1.jpg.

Det är även detta URI mönster (tillsammans med HTTP verb och lite header-data) du använder för att göra förändringar i ditt Blob Storage.

Notera! Det finns ett ytterligare koncept som kan vara värt att känna till. Det är Blocks. Ett Block är en del av en Blob. Vilket du kan behöva nyttja om du vill ladda upp en stor Blob (>64MB) eller liknande.

Exempel

I följande exempel har jag använt klientkomponentera i WCF REST Starter Kit för att interagera med mitt Blob Storage. Det går bra med gamla hederliga HttpWebRequest också men jag tycker HttpClient tillsammans med Visual Studio verktygen som WCF REST Starter Kit tillhandahåller gör livet något enklare. (Var det någon som sade Paste XML as Types? Yeah!)

Först ut är lista Containers i mitt konto (Account).

image

 public ActionResult Index() {

    HttpClient http = new HttpClient(_blobStorageEndpoint + "/?comp=list");
    http.DefaultHeaders.Add("x-ms-date", DateTime.UtcNow.ToString("R"));
    AddAzureAuthorizationHeader(http, "GET", "/" + _accountName + "/?comp=list");

    HttpResponseMessage response = http.Get();
    ViewData["containers"] = response.Content.ReadAsXmlSerializable<ContainerEnumerationResults>();

    return View();

}

På första raden instansierar jag HttpClient och anger vilken URI jag vill utföra förfrågan på. Sist i URI:n anger jag operationen list vilken listar innehållet vi mitt Account. Efterföljande två rader lägger till header värden för auktorisering.

Det lilla tricket här är att signera förfrågan. Det har jag implementerat i metoden AddAzureAuthorizationHeader. Man måste signera header informationen med hjälp av en, med Windows Azure Storage, delad nyckel.   

     //sign
    byte[] signBytes = Encoding.UTF8.GetBytes(stringToSign);
    HMACSHA256 Sha256 = new HMACSHA256(Convert.FromBase64String(accountSharedKey));

    String authorizationHeader = "SharedKey " + accountName + ":" + Convert.ToBase64String(Sha256.ComputeHash(signBytes));

    //add authz header to request
    http.DefaultHeaders.Add("Authorization", authorizationHeader);

Mer information om signering och auktorisering hittar du här: https://msdn.microsoft.com/en-us/library/dd179428.aspx

När jag klickar på en Container på sidan så vill jag ju naturligtvis visa vilka Blobbar som ligger där i.

image

Controller Action:en Blobs listar innehållet i vald Container.

 public ActionResult Blobs(string container) {

    HttpClient http = new HttpClient(_blobStorageEndpoint + "/" + container + "?comp=list");
    http.DefaultHeaders.Add("x-ms-date", DateTime.UtcNow.ToString("R"));
    AddAzureAuthorizationHeader(http, "GET", "/" + _accountName + "/" + container + "?comp=list");

    HttpResponseMessage response = http.Get();

    ViewData["container"] = container;
    ViewData["blobs"] = response.Content.ReadAsXmlSerializable<BlobEnumerationResults>();
    return View();
}

Förfrågan är väldigt lik föregående förfrågan. Tillägget är Container namnet i URI:n. (_blobStorageEndpoint + "/" + container + "?comp=list") . En HTTP GET förfrågan avfyras och resultatet deserialiseras till ett BlobEnumerationResults objekt vilket sedan skrivs ut i vyn.

För att ladda upp en ny Blob används HTTP verbet PUT istället för som tidigare, GET. Jag måste tala om för Windows Azure Blob Storage hur stor Blobben är som kommer genom att ange HTTP headern Content-Lenght.

 public ActionResult UploadBlob(string container) {

    string blobName = DateTime.Now.Ticks.ToString() + ".jpg";
    byte[] blobData = System.IO.File.ReadAllBytes(_blobToUpload);


    HttpClient http = new HttpClient();
    http.DefaultHeaders.Add("x-ms-date", DateTime.UtcNow.ToString("R"));
    http.DefaultHeaders.ContentLength = blobData.Length;

    AddAzureAuthorizationHeader(http, "PUT", "/" + _accountName + "/" + container + "/" + blobName);

    http.Put(_blobStorageEndpoint + "/" + container + "/" + blobName,
        HttpContent.Create(blobData));

    return RedirectToAction("Blobs", new { container = container });
}

Kontakta mig så skickar jag exempelprojektet till dig.

Håll ut! Snart tittar vi vidare på Windows Azure Tables.

-c