Compartilhar via


Armazenar e acessar dados no Armazenamento do Azure a partir de Xamarin.Forms

O Armazenamento do Azure é uma solução de armazenamento em nuvem escalonável que pode ser usada para armazenar dados não estruturados e estruturados. Este artigo demonstra como usar Xamarin.Forms para armazenar texto e dados binários no Armazenamento do Azure e como acessar os dados.

O Armazenamento do Azure fornece quatro serviços de armazenamento:

  • Armazenamento de Blobs. Um blob pode ser texto ou dados binários, como backups, máquinas virtuais, arquivos de mídia ou documentos.
  • O Armazenamento de Tabela é um repositório de atributos de chave NoSQL.
  • O Queue Storage é um serviço de mensagens para processamento de fluxo de trabalho e comunicação entre serviços de nuvem.
  • O Armazenamento de Arquivos fornece armazenamento compartilhado usando o protocolo SMB.

Existem dois tipos de contas de armazenamento:

  • Uma conta de armazenamento de uso geral fornece acesso aos serviços de Armazenamento do Azure a partir de uma única conta.
  • Uma conta de armazenamento de Blobs é uma conta de armazenamento especializada para armazenar blobs. Esse tipo de conta é recomendado quando você só precisa armazenar dados de blob.

Este artigo e o aplicativo de exemplo que o acompanha demonstram o upload de arquivos de imagem e texto para o armazenamento de blob e o download deles. Além disso, ele também demonstra a recuperação de uma lista de arquivos do armazenamento de blob e a exclusão de arquivos.

Para obter mais informações sobre o Armazenamento do Azure, consulte Introdução ao Armazenamento.

Observação

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Introdução ao Armazenamento de Blobs

O armazenamento de blobs consiste em três componentes, que são mostrados no diagrama a seguir:

Conceitos do Armazenamento do blob

Todo o acesso ao Armazenamento do Azure é feito por meio de uma conta de armazenamento. Uma conta de armazenamento pode conter um número ilimitado de contêineres e um contêiner pode armazenar um número ilimitado de blobs, até o limite de capacidade da conta de armazenamento.

Um blob é um arquivo de qualquer tipo e tamanho. O Armazenamento do Azure dá suporte a três tipos diferentes de blob:

  • Os blobs de bloco são otimizados para streaming e armazenamento de objetos em nuvem e são uma boa opção para armazenar backups, arquivos de mídia, documentos etc. Os blobs de bloco podem ter até 195 Gb de tamanho.
  • Os blobs de acréscimo são semelhantes aos blobs de bloco, mas são otimizados para operações de acréscimo, como registro em log. Os blobs de acréscimo podem ter até 195 Gb de tamanho.
  • Os blobs de página são otimizados para operações frequentes de leitura/gravação e normalmente são usados para armazenar máquinas virtuais e seus discos. Os blobs de página podem ter até 1 Tb de tamanho.

Observação

Observe que as contas de armazenamento de blob oferecem suporte a blobs de bloco e acréscimo, mas não a blobs de página.

Um blob é carregado no Armazenamento do Azure e baixado do Armazenamento do Azure como um fluxo de bytes. Portanto, os arquivos devem ser convertidos em um fluxo de bytes antes do upload e convertidos de volta à sua representação original após o download.

Cada objeto armazenado no Armazenamento do Azure tem um endereço URL exclusivo. O nome da conta de armazenamento forma o subdomínio desse endereço, e a combinação de subdomínio e nome de domínio forma um ponto de extremidade para a conta de armazenamento. Por exemplo, se sua conta de armazenamento for denominada mystorageaccount, o ponto de extremidade de blob padrão para a conta de armazenamento será https://mystorageaccount.blob.core.windows.net.

A URL para acessar um objeto em uma conta de armazenamento é compilada acrescentando o local do objeto na conta de armazenamento ao ponto de extremidade. Por exemplo, um endereço de blob terá o formato https://mystorageaccount.blob.core.windows.net/mycontainer/myblob.

Instalação

O processo para integrar uma conta de Armazenamento do Azure em um Xamarin.Forms aplicativo é o seguinte:

  1. Criar uma conta de armazenamento. Para obter mais informações, consulte Criar uma conta de armazenamento.
  2. Adicione a Biblioteca de Cliente de Armazenamento do Azure ao Xamarin.Forms aplicativo.
  3. Configure a cadeia de conexão de armazenamento. Para obter mais informações, consulte Conectando-se ao Armazenamento do Azure.
  4. Adicione using diretivas para namespaces e Microsoft.WindowsAzure.Storage.Blob às classes que acessarão o Microsoft.WindowsAzure.Storage Armazenamento do Azure.

Conectando-se ao Armazenamento do Azure

Todas as solicitações feitas em relação aos recursos da conta de armazenamento devem ser autenticadas. Embora os blobs possam ser configurados para oferecer suporte à autenticação anônima, há duas abordagens principais que um aplicativo pode usar para autenticar com uma conta de armazenamento:

  • Chave compartilhada. Essa abordagem usa o nome da conta de Armazenamento do Azure e a chave da conta para acessar os serviços de armazenamento. Uma conta de armazenamento recebe duas chaves privadas na criação que podem ser usadas para autenticação de chave compartilhada.
  • Assinatura de Acesso Compartilhado. Esse é um token que pode ser anexado a uma URL que permite o acesso delegado a um recurso de armazenamento, com as permissões especificadas, pelo período de tempo em que ele é válido.

Podem ser especificadas cadeias de conexão que incluem as informações de autenticação necessárias para acessar os recursos de Armazenamento do Azure de um aplicativo. Além disso, uma cadeia de conexão pode ser configurada para se conectar ao emulador de armazenamento do Azure do Visual Studio.

Observação

O Armazenamento do Azure dá suporte a HTTP e HTTPS em uma cadeia de conexão. No entanto, o uso de HTTPS é recomendado.

Conectando-se ao emulador de armazenamento do Azure

O emulador de armazenamento do Azure fornece um ambiente local que emula os serviços de blob, fila e tabela do Azure para fins de desenvolvimento.

A seguinte cadeia de conexão deve ser usada para se conectar ao emulador de armazenamento do Azure:

UseDevelopmentStorage=true

Para obter mais informações sobre o emulador de armazenamento do Azure, consulte Usar o emulador de armazenamento do Azure para desenvolvimento e teste.

Conectando-se ao Armazenamento do Azure usando uma chave compartilhada

O seguinte formato de cadeia de conexão deve ser usado para se conectar ao Armazenamento do Azure com uma chave compartilhada:

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

myAccountName deve ser substituído pelo nome da sua conta de armazenamento e myAccountKey deve ser substituído por uma das duas chaves de acesso da conta.

Observação

Ao usar a autenticação de chave compartilhada, o nome da conta e a chave da conta serão distribuídos para cada pessoa que usar seu aplicativo, o que fornecerá acesso completo de leitura/gravação à conta de armazenamento. Portanto, use a autenticação de chave compartilhada apenas para fins de teste e nunca distribua chaves para outros usuários.

Conectando-se ao Armazenamento do Azure usando uma Assinatura de Acesso Compartilhado

O seguinte formato de cadeia de conexão deve ser usado para se conectar ao Armazenamento do Azure com uma SAS:

BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature

myBlobEndpoint deve ser substituído pela URL do ponto de extremidade do blob e mySharedAccessSignature deve ser substituído pelo SAS. O SAS fornece o protocolo, o ponto de extremidade de serviço e as credenciais para acessar o recurso.

Observação

A autenticação SAS é recomendada para aplicativos de produção. No entanto, em um aplicativo de produção, o SAS deve ser recuperado de um serviço de back-end sob demanda, em vez de ser empacotado com o aplicativo.

Para obter mais informações sobre assinaturas de acesso compartilhado, consulte Usando assinaturas de acesso compartilhado (SAS).

Criando um contêiner

O GetContainer método é usado para recuperar uma referência a um contêiner nomeado, que pode ser usado para recuperar blobs do contêiner ou para adicionar blobs ao contêiner. O seguinte exemplo de código mostra o método GetContainer:

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

O CloudStorageAccount.Parse método analisa uma cadeia de conexão e retorna uma CloudStorageAccount instância que representa a conta de armazenamento. Uma CloudBlobClient instância, que é usada para recuperar contêineres e blobs, é criada pelo CreateCloudBlobClient método. O GetContainerReference método recupera o contêiner especificado como uma CloudBlobContainer instância, antes que ele seja retornado ao método de chamada. Neste exemplo, o nome do contêiner é o valor de ContainerType enumeração, convertido em uma cadeia de caracteres minúscula.

Observação

Os nomes dos contêineres devem ser minúsculos e devem começar com uma letra ou número. Além disso, eles só podem conter letras, números e o caractere de traço, e devem ter entre 3 e 63 caracteres.

O GetContainer método é chamado da seguinte maneira:

var container = GetContainer(containerType);

A CloudBlobContainer instância pode ser usada para criar um contêiner se ele ainda não existir:

await container.CreateIfNotExistsAsync();

Por padrão, um contêiner recém-criado é privado. Isso significa que uma chave de acesso de armazenamento deve ser especificada para recuperar blobs do contêiner. Para obter informações sobre como tornar públicos os blobs em um contêiner, consulte Criar um contêiner.

Carregando dados em um contêiner

O UploadFileAsync método é usado para carregar um fluxo de dados de bytes para o armazenamento de blob e é mostrado no exemplo de código a seguir:

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

Depois de recuperar uma referência de contêiner, o método cria o contêiner se ele ainda não existir. Um novo Guid é então criado para atuar como um nome de blob exclusivo e uma referência de bloco de blob é recuperada como uma CloudBlockBlob instância. O fluxo de dados é então carregado no blob usando o UploadFromStreamAsync método, que cria o blob se ele ainda não existir ou o substitui se existir.

Antes que um arquivo possa ser carregado no armazenamento de blob usando esse método, ele deve primeiro ser convertido em um fluxo de bytes. Isso é demonstrado no exemplo de código a seguir:

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

Os text dados são convertidos em uma matriz de bytes, que é então encapsulada como um fluxo que é passado para o UploadFileAsync método.

Baixando dados de um contêiner

O GetFileAsync método é usado para baixar dados de blob do Armazenamento do Azure e é mostrado no exemplo de código a seguir:

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

Depois de recuperar uma referência de contêiner, o método recupera uma referência de blob para os dados armazenados. Se o blob existir, suas propriedades serão recuperadas FetchAttributesAsync pelo método. Uma matriz de bytes do tamanho correto é criada e o blob é baixado como uma matriz de bytes que é retornada ao método de chamada.

Depois de baixar os dados de byte de blob, eles devem ser convertidos em sua representação original. Isso é demonstrado no exemplo de código a seguir:

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

A matriz de bytes é recuperada do Armazenamento do Azure pelo GetFileAsync método, antes de ser convertida novamente em uma cadeia de caracteres codificada em UTF8.

Listando dados em um contêiner

O GetFilesListAsync método é usado para recuperar uma lista de blobs armazenados em um contêiner e é mostrado no exemplo de código a seguir:

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

Depois de recuperar uma referência de contêiner, o método usa o método do ListBlobsSegmentedAsync contêiner para recuperar referências aos blobs dentro do contêiner. Os resultados retornados ListBlobsSegmentedAsync pelo método são enumerados enquanto a BlobContinuationToken instância não nullé . Cada blob é convertido do retornado IListBlobItem para um CloudBlockBlob para acessar a Name propriedade do blob, antes que seu valor seja adicionado à allBlobsList coleção. Quando a BlobContinuationToken instância for null, o último nome de blob será retornado e a execução será encerrada pelo loop.

Excluindo dados de um contêiner

O DeleteFileAsync método é usado para excluir um blob de um contêiner e é mostrado no exemplo de código a seguir:

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

Depois de recuperar uma referência de contêiner, o método recupera uma referência de blob para o blob especificado. O blob é então excluído com o DeleteIfExistsAsync método.