Azure Blob Container线程安全吗?

时间:2016-05-17 07:56:34

标签: c# azure azure-storage

我有一个web api项目,用户可以上传图像并将其存储在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();
    }
}

我使用Autofac进行DI设置,我想知道是否有任何代码是线程安全的。即我是否可以使用所有请求用于获取对新blob的引用的单例容器,或者每次都需要运行此整个方法?我无法确定CloudStorageAccount / BlobClient / Container是否是线程安全的。

由于

1 个答案:

答案 0 :(得分:4)

来自CloudBlobContainer课程的文档:

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

我相信你也会为其他课程找到类似的东西。

如果可以的话,我想提出2条建议:

container.CreateIfNotExists();

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

为每个请求执行以下2行代码。如果您确定blob容器将存储在您的存储帐户中,则可以删除这些代码行,因为这两行都会进行网络调用并可能会降低系统速度。如果所有用户都在同一容器中上传文件,您可以在应用程序的启动时移动此代码。