Udostępnij za pośrednictwem


Przechowywanie i uzyskiwanie dostępu do danych w usłudze Azure Storage z usługi Azure Storage Xamarin.Forms

Azure Storage to skalowalne rozwiązanie magazynu w chmurze, które może służyć do przechowywania danych nieustrukturyzowanych i ustrukturyzowanych. W tym artykule pokazano, jak przechowywać Xamarin.Forms dane tekstowe i binarne w usłudze Azure Storage oraz jak uzyskiwać dostęp do danych.

Usługa Azure Storage oferuje cztery usługi magazynu:

  • Blob Storage. Obiekt blob może być danymi tekstowymi lub binarnymi, takimi jak kopie zapasowe, maszyny wirtualne, pliki multimedialne lub dokumenty.
  • Table Storage to magazyn atrybutów kluczy NoSQL.
  • Queue Storage to usługa obsługi komunikatów do przetwarzania przepływu pracy i komunikacji między usługami w chmurze.
  • Usługa File Storage udostępnia magazyn udostępniony przy użyciu protokołu SMB.

Istnieją dwa typy kont magazynu:

  • Konta magazynu ogólnego przeznaczenia zapewniają dostęp do usług Azure Storage z jednego konta.
  • Konto usługi Blob Storage to wyspecjalizowane konto magazynu do przechowywania obiektów blob. Ten typ konta jest zalecany, gdy trzeba przechowywać tylko dane obiektów blob.

W tym artykule i towarzyszącej przykładowej aplikacji pokazano przekazywanie plików obrazów i tekstu do magazynu obiektów blob oraz pobieranie ich. Ponadto demonstruje również pobieranie listy plików z magazynu obiektów blob i usuwanie plików.

Aby uzyskać więcej informacji na temat usługi Azure Storage, zobacz Wprowadzenie do usługi Storage.

Uwaga

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Wprowadzenie do usługi Blob Storage

Magazyn obiektów blob składa się z trzech składników, które przedstawiono na poniższym diagramie:

Pojęcia związane z usługą Blob Storage

Cały dostęp do usługi Azure Storage odbywa się za pośrednictwem konta magazynu. Konto magazynu może zawierać nieograniczoną liczbę kontenerów, a kontener może przechowywać nieograniczoną liczbę obiektów blob do limitu pojemności konta magazynu.

Obiekt blob to plik dowolnego typu i rozmiaru. Usługa Azure Storage obsługuje trzy różne typy obiektów blob:

  • Blokowe obiekty blob są zoptymalizowane pod kątem przesyłania strumieniowego i przechowywania obiektów w chmurze i są dobrym wyborem do przechowywania kopii zapasowych, plików multimedialnych, dokumentów itp. Blokowe obiekty blob mogą mieć rozmiar do 195 Gb.
  • Uzupełnialne obiekty blob są podobne do blokowych obiektów blob, ale są zoptymalizowane pod kątem operacji dołączania, takich jak rejestrowanie. Uzupełnialne obiekty blob mogą mieć rozmiar do 195 Gb.
  • Stronicowe obiekty blob są zoptymalizowane pod kątem częstych operacji odczytu/zapisu i są zwykle używane do przechowywania maszyn wirtualnych i ich dysków. Rozmiar stronicowych obiektów blob może wynosić do 1 Tb.

Uwaga

Należy pamiętać, że konta magazynu obiektów blob obsługują blokowe i uzupełnialne obiekty blob, ale nie stronicowe obiekty blob.

Obiekt blob jest przekazywany do usługi Azure Storage i pobierany z usługi Azure Storage jako strumień bajtów. W związku z tym pliki muszą być konwertowane na strumień bajtów przed przekazaniem i konwertowane z powrotem na oryginalną reprezentację po pobraniu.

Każdy obiekt przechowywany w usłudze Azure Storage ma unikatowy adres URL. Nazwa konta magazynu tworzy poddomenę tego adresu, a kombinacja poddomeny i nazwy domeny stanowi punkt końcowy dla konta magazynu. Jeśli na przykład konto magazynu nosi nazwę mystorageaccount, domyślnym punktem końcowym obiektu blob dla konta magazynu jest https://mystorageaccount.blob.core.windows.net.

Adres URL dostępu do obiektu w koncie magazynu jest tworzony przez dodanie lokalizacji obiektu na koncie magazynu do punktu końcowego. Na przykład adres obiektu blob będzie miał format https://mystorageaccount.blob.core.windows.net/mycontainer/myblob.

Ustawienia

Proces integrowania konta usługi Azure Storage z aplikacją Xamarin.Forms jest następujący:

  1. Create a storage account (Tworzenie konta magazynu). Aby uzyskać więcej informacji, zobacz temat Tworzenie konta.
  2. Dodaj bibliotekę Xamarin.Forms klienta usługi Azure Storage do aplikacji.
  3. Skonfiguruj parametry połączenia magazynu. Aby uzyskać więcej informacji, zobacz Połączenie do usługi Azure Storage.
  4. Dodaj using dyrektywy dla Microsoft.WindowsAzure.Storage przestrzeni nazw i Microsoft.WindowsAzure.Storage.Blob do klas, które będą uzyskiwać dostęp do usługi Azure Storage.

Nawiązywanie połączenia z usługą Azure Storage

Każde żądanie dotyczące zasobów konta magazynu musi być uwierzytelnione. Chociaż obiekty blob można skonfigurować do obsługi uwierzytelniania anonimowego, istnieją dwa główne podejścia, których aplikacja może użyć do uwierzytelniania przy użyciu konta magazynu:

  • Klucz wspólny. Ta metoda używa nazwy konta usługi Azure Storage i klucza konta do uzyskiwania dostępu do usług magazynu. Konto magazynu ma przypisane dwa klucze prywatne podczas tworzenia, które mogą być używane do uwierzytelniania za pomocą klucza współużytkowanego.
  • Sygnatura dostępu współdzielonego. Jest to token, który można dołączyć do adresu URL, który umożliwia delegowany dostęp do zasobu magazynu z określonymi uprawnieniami przez okres ważności.

można określić ciągi Połączenie ion, które zawierają informacje dotyczące uwierzytelniania wymagane do uzyskania dostępu do zasobów usługi Azure Storage z aplikacji. Ponadto można skonfigurować parametry połączenia w celu nawiązania połączenia z emulatorem usługi Azure Storage z poziomu programu Visual Studio.

Uwaga

Usługa Azure Storage obsługuje protokół HTTP i HTTPS w parametry połączenia. Jednak korzystanie z protokołu HTTPS jest zalecane.

Połączenie do emulatora usługi Azure Storage

Emulator usługi Azure Storage udostępnia środowisko lokalne, które emuluje usługi azure blob, queue i table na potrzeby programowania.

Następujące parametry połączenia należy użyć do nawiązania połączenia z emulatorem usługi Azure Storage:

UseDevelopmentStorage=true

Aby uzyskać więcej informacji na temat emulatora usługi Azure Storage, zobacz Korzystanie z emulatora usługi Azure Storage na potrzeby programowania i testowania.

Połączenie do usługi Azure Storage przy użyciu klucza współużytkowanego

Do nawiązania połączenia z usługą Azure Storage przy użyciu klucza współużytkowanego należy użyć następującego formatu parametry połączenia:

DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey

myAccountName element powinien zostać zastąpiony nazwą konta magazynu i myAccountKey powinien zostać zastąpiony jednym z dwóch kluczy dostępu do konta.

Uwaga

W przypadku korzystania z uwierzytelniania za pomocą klucza współużytkowanego nazwa konta i klucz konta będą dystrybuowane do każdej osoby korzystającej z aplikacji, co zapewni pełny dostęp do odczytu/zapisu na koncie magazynu. W związku z tym należy używać uwierzytelniania klucza współużytkowanego tylko do celów testowych i nigdy nie rozpowszechniać kluczy do innych użytkowników.

Połączenie do usługi Azure Storage przy użyciu sygnatury dostępu współdzielonego

Do nawiązania połączenia z usługą Azure Storage przy użyciu sygnatury dostępu współdzielonego należy użyć następującego formatu parametry połączenia:

BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature

myBlobEndpoint element powinien zostać zastąpiony adresem URL punktu końcowego obiektu blob i mySharedAccessSignature powinien zostać zastąpiony sygnaturą dostępu współdzielonego. Sygnatura dostępu współdzielonego udostępnia protokół, punkt końcowy usługi i poświadczenia umożliwiające dostęp do zasobu.

Uwaga

Uwierzytelnianie sygnatury dostępu współdzielonego jest zalecane w przypadku aplikacji produkcyjnych. Jednak w aplikacji produkcyjnej sygnatura dostępu współdzielonego powinna być pobierana z usługi zaplecza na żądanie, a nie dołączana do aplikacji.

Aby uzyskać więcej informacji na temat sygnatur dostępu współdzielonego, zobacz Używanie sygnatur dostępu współdzielonego (SAS).

Tworzenie kontenera

Metoda GetContainer służy do pobierania odwołania do nazwanego kontenera, który następnie może służyć do pobierania obiektów blob z kontenera lub dodawania obiektów blob do kontenera. Poniższy przykład kodu przedstawia metodę GetContainer :

static CloudBlobContainer GetContainer(ContainerType containerType)
{
  var account = CloudStorageAccount.Parse(Constants.StorageConnection);
  var client = account.CreateCloudBlobClient();
  return client.GetContainerReference(containerType.ToString().ToLower());
}

Metoda CloudStorageAccount.Parse analizuje parametry połączenia i zwraca CloudStorageAccount wystąpienie reprezentujące konto magazynu. Wystąpienie CloudBlobClient używane do pobierania kontenerów i obiektów blob jest następnie tworzone przez metodę CreateCloudBlobClient . Metoda GetContainerReference pobiera określony kontener jako CloudBlobContainer wystąpienie, zanim zostanie zwrócona do metody wywołującej. W tym przykładzie nazwa kontenera to ContainerType wartość wyliczenia, przekonwertowana na ciąg małych liter.

Uwaga

Nazwy kontenerów muszą być małymi literami i muszą zaczynać się literą lub cyfrą. Ponadto mogą zawierać tylko litery, cyfry i znak kreski i muszą mieć długość od 3 do 63 znaków.

Metoda jest wywoływana GetContainer w następujący sposób:

var container = GetContainer(containerType);

Następnie CloudBlobContainer można użyć wystąpienia do utworzenia kontenera, jeśli jeszcze nie istnieje:

await container.CreateIfNotExistsAsync();

Domyślnie nowo utworzony kontener jest prywatny. Oznacza to, że należy określić klucz dostępu do magazynu w celu pobrania obiektów blob z kontenera. Aby uzyskać informacje o tworzeniu obiektów blob w kontenerze publicznym, zobacz Tworzenie kontenera.

Przekazywanie danych do kontenera

Metoda UploadFileAsync służy do przekazywania strumienia danych bajtów do magazynu obiektów blob i jest wyświetlana w poniższym przykładzie kodu:

public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
  var container = GetContainer(containerType);
  await container.CreateIfNotExistsAsync();

  var name = Guid.NewGuid().ToString();
  var fileBlob = container.GetBlockBlobReference(name);
  await fileBlob.UploadFromStreamAsync(stream);

  return name;
}

Po pobraniu odwołania do kontenera metoda tworzy kontener, jeśli jeszcze nie istnieje. Następnie zostanie utworzona nowa Guid nazwa, która będzie działać jako unikatowa nazwa obiektu blob, a odwołanie do bloku obiektów blob jest pobierane jako CloudBlockBlob wystąpienie. Strumień danych jest następnie przekazywany do obiektu blob przy użyciu UploadFromStreamAsync metody , która tworzy obiekt blob, jeśli jeszcze nie istnieje, lub zastępuje go, jeśli istnieje.

Aby można było przekazać plik do magazynu obiektów blob przy użyciu tej metody, należy go najpierw przekonwertować na strumień bajtów. Przedstawiono to w poniższym przykładzie kodu:

var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));

Dane text są konwertowane na tablicę bajtów, która jest następnie owinięta jako strumień przekazywany do UploadFileAsync metody.

Pobieranie danych z kontenera

Metoda służy do pobierania GetFileAsync danych obiektów blob z usługi Azure Storage i jest wyświetlana w poniższym przykładzie kodu:

public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
  var container = GetContainer(containerType);

  var blob = container.GetBlobReference(name);
  if (await blob.ExistsAsync())
  {
    await blob.FetchAttributesAsync();
    byte[] blobBytes = new byte[blob.Properties.Length];

    await blob.DownloadToByteArrayAsync(blobBytes, 0);
    return blobBytes;
  }
  return null;
}

Po pobraniu odwołania do kontenera metoda pobiera odwołanie do obiektu blob dla przechowywanych danych. Jeśli obiekt blob istnieje, jego właściwości są pobierane przez metodę FetchAttributesAsync . Zostanie utworzona tablica bajtów o poprawnym rozmiarze, a obiekt blob zostanie pobrany jako tablica bajtów, która zostanie zwrócona do metody wywołującej.

Po pobraniu danych bajtów obiektu blob należy je przekonwertować na oryginalną reprezentację. Przedstawiono to w poniższym przykładzie kodu:

var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);

Tablica bajtów jest pobierana z usługi Azure Storage za pomocą GetFileAsync metody , zanim zostanie przekonwertowana z powrotem na ciąg zakodowany w formacie UTF8.

Wyświetlanie listy danych w kontenerze

Metoda GetFilesListAsync służy do pobierania listy obiektów blob przechowywanych w kontenerze i jest wyświetlana w poniższym przykładzie kodu:

public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
  var container = GetContainer(containerType);

  var allBlobsList = new List<string>();
  BlobContinuationToken token = null;

  do
  {
    var result = await container.ListBlobsSegmentedAsync(token);
    if (result.Results.Count() > 0)
    {
      var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
      allBlobsList.AddRange(blobs);
    }
    token = result.ContinuationToken;
  } while (token != null);

  return allBlobsList;
}

Po pobraniu odwołania do kontenera metoda używa metody kontenera ListBlobsSegmentedAsync do pobierania odwołań do obiektów blob w kontenerze. Wyniki zwrócone przez metodę ListBlobsSegmentedAsync są wyliczane, gdy BlobContinuationToken wystąpienie nie nulljest . Każdy obiekt blob jest rzutowany IListBlobItem z obiektu zwróconego do CloudBlockBlob obiektu w celu uzyskania dostępu do Name właściwości obiektu blob, zanim zostanie dodana wartość do allBlobsList kolekcji. BlobContinuationToken Gdy wystąpienie ma nullwartość , zostanie zwrócona ostatnia nazwa obiektu blob, a wykonanie kończy pętlę.

Usuwanie danych z kontenera

Metoda DeleteFileAsync służy do usuwania obiektu blob z kontenera i jest wyświetlana w poniższym przykładzie kodu:

public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
  var container = GetContainer(containerType);
  var blob = container.GetBlobReference(name);
  return await blob.DeleteIfExistsAsync();
}

Po pobraniu odwołania do kontenera metoda pobiera odwołanie do obiektu blob dla określonego obiektu blob. Obiekt blob jest następnie usuwany za pomocą DeleteIfExistsAsync metody .