2016-05-17 2 views
0

У меня есть веб-проект api, где пользователи могут загружать изображение, и я храню его в Azure blob. Код выглядит следующим образом:Azure Blob Контейнерная резьба безопасна?

public class AzureImageHandler : IImageHandler 
{  
    public async Task<string> StoreImage(byte[] image) 
    { 
     var storageAccount = CloudStorageAccount.Parse(
      CloudConfigurationManager.GetSetting("StorageConnectionString")); 

     var blobClient = storageAccount.CreateCloudBlobClient(); 

     // Retrieve a reference to a container. 
     var container = blobClient.GetContainerReference("images"); 

     // Create the container if it doesn't already exist. 
     container.CreateIfNotExists(); 

     container.SetPermissions(
      new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 

     // Retrieve reference to a blob named "myblob". 
     var blockBlob = container.GetBlockBlobReference("myblob"); 

     await blockBlob.UploadFromByteArrayAsync(image, 0, image.Length); 

     return blockBlob.Uri.ToString(); 
    } 
} 

У меня есть DI настроить с помощью Autofac и мне интересно, если какой-либо из кода поточно. Т.е. я могу иметь контейнер singleton, который все запросы используют для получения ссылки на новый blob или мне нужно каждый раз запускать весь этот метод? Я не мог узнать, был ли CloudStorageAccount/BlobClient/Container потокобезопасным.

Благодаря

ответ

3

Из документации для CloudBlobContainer класса:

Любые открытые (Shared в Visual Basic) члены этого типа являются поточно. Любые члены экземпляра не гарантируют, что это будет поток .

Я уверен, что вы найдете похожие вещи и для других классов.

Если позволите, я хотел бы сделать 2 предложения:

container.CreateIfNotExists(); 

container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 

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