Azure Storage

Технический пост о работе с большими бинарными данными в Windows Azure. Для этого, напомню есть 4 возможности. Сохранение данных на диске самой веб-роли, например в Server.MapPath("~/"). Но тут очень жесткие ограничения примерно в 100МБ, и нет доступа между ролями. Далее есть LocalStorage - это подключаемый диск, который может быть доступен с разных ролей. Обычный размер порядка 200Гб, однако рано или поздно при выполнении SwapVIP между Stage и Production он затрется. Следующий уровень и самый логичный - это статичная SQL база. Но хранить много данных в ней - дорого, да и все фишки с транзакциями - не нужны по большей части.
И тут на помощь приходит Storage BLOB, объект которых мы заводим в Global.aspx
Copy Source | Copy HTML
  1. #region Работа через BLOB
  2.         private static CloudBlobContainer _container;
  3.         public static CloudBlobContainer Container
  4.         {
  5.             get
  6.             {
  7.                 if (_container != null) return _container;
  8.                 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
  9.                         RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
  10.                 CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
  11.                 // Retrieve a reference to a container  
  12.                 _container = blobClient.GetContainerReference("images");
  13.                 // Create the container if it doesn't already exist
  14.                 _container.CreateIfNotExist();
  15.                 //закрыли видимость из интернета
  16.                 _container.SetPermissions(
  17.                         new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob});
  18.                 return _container;
  19.             }
  20.         }
  21.         #endregion

Далее функции записи и чтения выглядят следующим образом. Отмечу 2 особенности. Чтобы сохранить информацию о blob необходимо вызвать SetProperties. И второе, что при загрузке перед вызовом FetchAttribues обязательно проверять работаем ли мы с BlockBlob или PageBlock, так как тип, еще до вызова FetchAttribues выставляется в произвольное значение и неправильный вызов может повлечь исключение.
Copy Source | Copy HTML
  1. try
  2.         {
  3.             //проверяем есть ли в контейнере нужный файл!
  4.             CloudBlockBlob blob = Global.Container.GetBlockBlobReference(filename);
  5.             if(blob.Attributes.Properties.BlobType == BlobType.PageBlob)
  6.             {
  7.                 CloudPageBlob blob2 = Global.Container.GetPageBlobReference(filename);
  8.                 if (ReplyDataFromBlob(blob2, context))
  9.                 {
  10.                     return ImgStatus.Loaded;
  11.                 }
  12.             }else
  13.             {
  14.                 if (ReplyDataFromBlob(blob, context))
  15.                 {
  16.                     return ImgStatus.Loaded;
  17.                 }
  18.             }
  19.         }
  20.         catch(StorageClientException e0)
  21.         {
  22.         }
Copy Source | Copy HTML
  1. //проверяем есть ли в контейнере нужный файл!
  2.         CloudBlockBlob blob = Global.Container.GetBlockBlobReference(filename);
  3.         //blob.DeleteIfExists();
  4.         // Create or overwrite the "myblob" blob with contents from a local file
  5.         using (var fileStream = File.OpenRead(realfile))
  6.         {
  7.             blob.UploadFromStream(fileStream);
  8.             blob.Properties.ContentType = "image/" + Path.GetExtension(realfile).Substring(1);
  9.             blob.SetProperties();
  10.         }

Метки:   


blog comments powered by Disqus

Добавить комментарий

Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Реклама

 

копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008