我有一个web项目,用户可以上传图像,并存储在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是否线程安全。
谢谢
发布于 2016-05-17 09:04:28
来自CloudBlobContainer类的文档:
此类型的任何公共静态(在Visual中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。
我相信你也会在其他课程中找到类似的东西。
如果可以的话,我想提出两个建议:
container.CreateIfNotExists();
container.SetPermissions(
new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });对每个请求执行以下2行代码。如果您相当肯定blob容器将在您的存储帐户中,您可以删除这两行代码,因为这两行进行网络调用,并可能减慢您的系统。如果所有用户都在同一个容器中上载文件,则可以在应用程序的启动中移动此代码。
https://stackoverflow.com/questions/37270321
复制相似问题