Хранение и доступ к данным в служба хранилища AzureXamarin.Forms

Download Sample Скачайте пример

служба хранилища Azure — это масштабируемое облачное хранилище, которое можно использовать для хранения неструктурированных и структурированных данных. В этой статье показано, как хранить Xamarin.Forms текстовые и двоичные данные в служба хранилища Azure и как получить доступ к данным.

служба хранилища Azure предоставляет четыре службы хранилища:

  • Хранилище BLOB-объектов. Большой двоичный объект может быть текстовым или двоичным данным, например резервными копиями, виртуальными машинами, файлами мультимедиа или документами.
  • Таблица служба хранилища — это хранилище ключевых атрибутов NoSQL.
  • Служба хранилища очереди — это служба обмена сообщениями для обработки рабочих процессов и обмена данными между облачными службами.
  • Файл служба хранилища предоставляет общее хранилище с помощью протокола S МБ.

Существует два типа учетных записей хранения:

  • Учетные записи хранения общего назначения предоставляют доступ к службам служба хранилища Azure из одной учетной записи.
  • Учетная запись хранения BLOB-объектов — это специализированная учетная запись хранения для хранения BLOB-объектов. Этот тип учетной записи рекомендуется, если необходимо хранить только данные BLOB-объектов.

В этой статье и сопутствующем примере приложения демонстрируется отправка изображений и текстовых файлов в хранилище BLOB-объектов и их скачивание. Кроме того, он также демонстрирует получение списка файлов из хранилища BLOB-объектов и удаление файлов.

Дополнительные сведения о служба хранилища Azure см. в статье "Введение в служба хранилища".

Примечание.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

Общие сведения о служба хранилища BLOB-объектов

Хранилище BLOB-объектов состоит из трех компонентов, которые показаны на следующей схеме:

Blob Storage Concepts

Все доступ к служба хранилища Azure осуществляется через учетную запись хранения. Учетная запись хранения может содержать неограниченное количество контейнеров, а контейнер может хранить неограниченное количество больших двоичных объектов до ограничения емкости учетной записи хранения.

Большой двоичный объект — это файл любого типа и размера. служба хранилища Azure поддерживает три различных типа BLOB-объектов:

  • Блочные BLOB-объекты оптимизированы для потоковой передачи и хранения облачных объектов и являются хорошим выбором для хранения резервных копий, файлов мультимедиа, документов и т. д. Блочные большие двоичные объекты могут иметь размер до 195 ГБ.
  • Большие двоичные объекты добавления похожи на блочные BLOB-объекты, но оптимизированы для операций добавления, таких как ведение журнала. Добавление больших двоичных объектов может составлять до 195 ГБ.
  • Страничные BLOB-объекты оптимизированы для частых операций чтения и записи и обычно используются для хранения виртуальных машин и их дисков. Большие двоичные объекты страницы могут иметь размер до 1 ТБ.

Примечание.

Обратите внимание, что учетные записи хранения BLOB-объектов поддерживают блокировку и добавление больших двоичных объектов, но не страничных BLOB-объектов.

Большой двоичный объект отправляется в служба хранилища Azure и загружается из служба хранилища Azure в виде потока байтов. Поэтому файлы необходимо преобразовать в поток байтов перед отправкой и преобразовать обратно в исходное представление после скачивания.

Каждый объект, хранящийся в служба хранилища Azure, имеет уникальный URL-адрес. Имя учетной записи хранения формирует поддомен этого адреса, а сочетание поддомена и доменного имени формирует конечную точку для учетной записи хранения. Например, если учетная запись хранения называется mystorageaccount, то для учетной записи хранения используется https://mystorageaccount.blob.core.windows.netконечная точка BLOB-объектов по умолчанию.

URL-адрес для доступа к объекту в учетной записи хранения строится путем добавления местоположения объекта в учетной записи хранения к конечной точке. Например, адрес большого двоичного объекта будет иметь формат https://mystorageaccount.blob.core.windows.net/mycontainer/myblob.

Настройка

Процесс интеграции учетной записи служба хранилища Azure в Xamarin.Forms приложение выглядит следующим образом:

  1. Создание учетной записи хранения. Дополнительные сведения см. в разделе Создание учетной записи хранения.
  2. Добавьте в приложение клиентская библиотекаXamarin.Forms служба хранилища Azure.
  3. Настройте строка подключения хранилища. Дополнительные сведения см. в Подключение служба хранилища Azure.
  4. Добавьте using директивы для Microsoft.WindowsAzure.Storage пространств имен в Microsoft.WindowsAzure.Storage.Blob классы, которые будут получать доступ к служба хранилища Azure.

Подключение к службе хранилища Azure

Каждый запрос, сделанный в отношении ресурсов учетной записи хранения, должен проходить проверку подлинности. Хотя большие двоичные объекты можно настроить для поддержки анонимной проверки подлинности, существует два основных подхода, которые приложение может использовать для проверки подлинности с помощью учетной записи хранения:

  • Общий ключ. Этот подход использует имя учетной записи служба хранилища Azure и ключ учетной записи для доступа к службам хранения. Для создания учетной записи хранения назначается два закрытых ключа, которые можно использовать для проверки подлинности с общим ключом.
  • Подписанный URL-адрес. Это маркер, который можно добавить к URL-адресу, который обеспечивает делегированный доступ к ресурсу хранилища с указанными разрешениями в течение допустимого периода времени.

строки Подключение ion можно указать, включая сведения о проверке подлинности, необходимые для доступа к ресурсам служба хранилища Azure из приложения. Кроме того, строка подключения можно настроить для подключения к эмулятору хранилища Azure из Visual Studio.

Примечание.

служба хранилища Azure поддерживает HTTP и HTTPS в строка подключения. Однако рекомендуется использовать ПРОТОКОЛ HTTPS.

Подключение эмулятор служба хранилища Azure

Эмулятор хранилища Azure предоставляет локальную среду, которая эмулирует большие двоичные объекты, очереди и службы таблиц Azure для целей разработки.

Для подключения к эмулятору хранилища Azure следует использовать следующие строка подключения:

UseDevelopmentStorage=true

Дополнительные сведения об эмуляторе хранилища Azure см. в статье "Использование эмулятора хранилища Azure для разработки и тестирования".

Подключение служба хранилища Azure с помощью общего ключа

Следующий формат строка подключения должен использоваться для подключения к служба хранилища Azure с общим ключом:

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

myAccountName следует заменить именем учетной записи хранения и myAccountKey заменить одним из двух ключей доступа к учетной записи.

Примечание.

При использовании проверки подлинности с общим ключом имя учетной записи и ключ учетной записи будут распространяться каждому пользователю, используюющему приложение, что обеспечит полный доступ на чтение и запись к учетной записи хранения. Поэтому используйте проверку подлинности с общим ключом только для тестирования и никогда не распределяйте ключи другим пользователям.

Подключение служба хранилища Azure с помощью подписанного URL-адреса

Для подключения к служба хранилища Azure с помощью SAS следует использовать следующий формат строка подключения:

BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature

myBlobEndpoint следует заменить URL-адрес конечной точки большого двоичного объекта и mySharedAccessSignature заменить его НА SAS. SAS предоставляет протокол, конечную точку службы и учетные данные для доступа к ресурсу.

Примечание.

Для рабочих приложений рекомендуется использовать проверку подлинности SAS. Однако в рабочем приложении SAS следует получить из серверной службы по запросу, а не упаковать с приложением.

Дополнительные сведения о подписанных URL-адресах см. в статье Об использовании подписанных URL-адресов (SAS).

Создание контейнера

Этот GetContainer метод используется для получения ссылки на именованный контейнер, который затем можно использовать для извлечения больших двоичных объектов из контейнера или добавления больших двоичных объектов в контейнер. Метод GetContainer показан в следующем примере кода:

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

Метод CloudStorageAccount.Parse анализирует строка подключения и возвращает CloudStorageAccount экземпляр, представляющий учетную запись хранения. CloudBlobClient Экземпляр, который используется для извлечения контейнеров и БОЛЬШИХ двоичных объектов, затем создается методомCreateCloudBlobClient. Метод GetContainerReference извлекает указанный CloudBlobContainer контейнер в качестве экземпляра, прежде чем он возвращается вызывающему методу. В этом примере имя контейнера — это ContainerType значение перечисления, преобразованное в строчную строку.

Примечание.

Имена контейнеров должны быть строчными и должны начинаться с буквы или числа. Кроме того, они могут содержать только буквы, цифры и символ тире, а также должны содержать от 3 до 63 символов.

Метод GetContainer вызывается следующим образом:

var container = GetContainer(containerType);

Затем CloudBlobContainer экземпляр можно использовать для создания контейнера, если он еще не существует:

await container.CreateIfNotExistsAsync();

По умолчанию созданный контейнер является частным. Это означает, что ключ доступа к хранилищу должен быть указан для получения больших двоичных объектов из контейнера. Сведения о создании больших двоичных объектов в общедоступном контейнере см. в разделе "Создание контейнера".

Отправка данных в контейнер

Метод UploadFileAsync используется для отправки потока байтовых данных в хранилище BLOB-объектов и показан в следующем примере кода:

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

После получения ссылки на контейнер метод создает контейнер, если он еще не существует. Затем создается новый Guid объект, который будет выступать в качестве уникального имени большого двоичного объекта, а ссылка на блок больших двоичных объектов извлекается в качестве экземпляра CloudBlockBlob . Затем поток данных передается в большой двоичный объект с помощью UploadFromStreamAsync метода, который создает большой двоичный объект, если он еще не существует, или перезаписывает его, если он существует.

Перед отправкой файла в хранилище BLOB-объектов с помощью этого метода сначала необходимо преобразовать его в поток байтов. Это демонстрируется в следующем примере кода:

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

Данные text преобразуются в массив байтов, который затем упаковывается в виде потока, передаваемого методу UploadFileAsync .

Скачивание данных из контейнера

Метод GetFileAsync используется для скачивания данных BLOB-объектов из служба хранилища Azure и показан в следующем примере кода:

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

После получения ссылки на контейнер метод получает ссылку на большой двоичный объект для сохраненных данных. Если большой двоичный объект существует, его свойства извлекаются методом FetchAttributesAsync . Создается массив байтов правильного размера, и большой двоичный объект загружается в виде массива байтов, возвращаемых вызывающей методу.

После скачивания данных байтов большого двоичного объекта его необходимо преобразовать в исходное представление. Это демонстрируется в следующем примере кода:

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

Массив байтов извлекается из служба хранилища Azure методомGetFileAsync, прежде чем он преобразуется обратно в строку в кодировке UTF8.

Перечисление данных в контейнере

Метод GetFilesListAsync используется для получения списка BLOB-объектов, хранящихся в контейнере, и показан в следующем примере кода:

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

После получения ссылки на контейнер метод использует метод контейнера ListBlobsSegmentedAsync для получения ссылок на большие двоичные объекты в контейнере. Результаты, возвращаемые методом ListBlobsSegmentedAsync , перечисляются, пока BlobContinuationToken экземпляр не nullявляется. Каждый большой двоичный объект создается из возвращаемого IListBlobItemCloudBlockBlob объекта в порядок доступа к Name свойству большого двоичного объекта перед добавлением значения в коллекцию allBlobsList . После получения nullэкземпляра BlobContinuationToken возвращается последнее имя большого двоичного объекта, а выполнение завершает цикл.

Удаление данных из контейнера

Метод DeleteFileAsync используется для удаления большого двоичного объекта из контейнера и показан в следующем примере кода:

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

После получения ссылки на контейнер метод получает ссылку на большой двоичный объект для указанного большого двоичного объекта. Затем большой двоичный объект удаляется с DeleteIfExistsAsync помощью метода.