我有一个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是否是线程安全的。
由于
答案 0 :(得分:4)
来自CloudBlobContainer
课程的文档:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。任何实例成员都不能保证是线程 安全
我相信你也会为其他课程找到类似的东西。
如果可以的话,我想提出2条建议:
container.CreateIfNotExists();
container.SetPermissions(
new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
为每个请求执行以下2行代码。如果您确定blob容器将存储在您的存储帐户中,则可以删除这些代码行,因为这两行都会进行网络调用并可能会降低系统速度。如果所有用户都在同一容器中上传文件,您可以在应用程序的启动时移动此代码。