应用加密后 Azure Blob 超时
Posted
技术标签:
【中文标题】应用加密后 Azure Blob 超时【英文标题】:Azure Blob timeouts after encryption was applied 【发布时间】:2016-09-05 14:17:23 【问题描述】:我开始加密我的 Azure blob。现在我偶尔在请求暂停大约 30 秒左右后收到 500 - blob 操作(下载和上传 blob)的请求超时。在这些超时之一之后,其他 blob 操作将无法通过该应用运行,除非我重新启动我的 Azure 网站。重新启动后,一切都会按预期运行一段时间。
示例:如果我通过我的应用程序访问加密图像(我正在使用 WebAPI 将其拉取并显示给用户),它会显示正常,但如果我尝试访问同一文件几小时后,请求停止并最终超时。之后,通过我的网络应用程序访问任何其他文件时,我遇到了同样的问题。但是,如果我访问 blob 的直接 url,那么我可以访问该文件(即使它已加密,因此无用)。
我无法确定是什么原因造成的,以及问题何时开始发生,因为我不是唯一访问该应用程序的人,因此问题很可能在我的请求失败之前就已经开始了。此外,在应用加密之前我从未遇到过此类问题,在本地测试加密时也没有遇到过问题。
知道为什么会发生这种情况,或者我该如何防止这种情况发生?如果有帮助,我将在下面附上我的代码:
public async Task<Tuple<string, string>> UploadToStorage(CloudBlobContainer container, Stream stream, string reference, string contentType, byte[] byteArray = null)
var blockBlob = container.GetBlockBlobReference(reference);
blockBlob.Properties.ContentType = contentType;
var cloudResolver = new KeyVaultKeyResolver(GetToken);
var rsa = await cloudResolver.ResolveKeyAsync(new BlobConfig().BlobKeyVault, CancellationToken.None);
var policy = new BlobEncryptionPolicy(rsa, null);
var options = new BlobRequestOptions EncryptionPolicy = policy ;
if (byteArray != null) blockBlob.UploadFromByteArray(byteArray, 0, byteArray.Length, null, options);
else blockBlob.UploadFromStream(stream, stream.Length, null, options);
return Tuple.Create(new Config().BaseUrl + "/api/blobs/" + container.Name + "/" + reference, blockBlob.Properties.ContentType);
public BlobDto DownloadBlob(string container, string filename)
var account = CloudStorageAccount.Parse(new BlobConfig().StorageConnectionString);
var blobClient = account.CreateCloudBlobClient();
var blobContainer = blobClient.GetContainerReference(container);
var blob = blobContainer.GetBlockBlobReference(filename);
var cloudResolver = new KeyVaultKeyResolver(GetToken);
var policy = new BlobEncryptionPolicy(null, cloudResolver);
var options = new BlobRequestOptions EncryptionPolicy = policy ;
var m = new MemoryStream();
blob.DownloadToStream(m, null, options);
return new BlobDto Blob = m.ToArray(), BlobContentType = blob.Properties.ContentType ;
private async static Task<string> GetToken(string authority, string resource, string scope)
var config = new BlobConfig();
var clientCredential = new ClientCredential(config.BlobClientId, config.BlobClientSecret);
var authContext = new AuthenticationContext(authority);
var result = await authContext.AcquireTokenAsync(resource, clientCredential);
if (result == null) throw new InvalidOperationException("Failed to obtain the access token");
return result.AccessToken;
【问题讨论】:
为什么UploadToStorage
不是异步的? - ....GetAwaiter().GetResult()
我已经用建议的调整更新了代码
【参考方案1】:
我用异步调用替换了所有与同步 blob 相关的调用,尤其是下载调用。也从流更改为字节数组,但我认为这无关紧要:
await blob.DownloadToByteArrayAsync(byteArray, 0, null, options, null);
【讨论】:
以上是关于应用加密后 Azure Blob 超时的主要内容,如果未能解决你的问题,请参考以下文章
无法加密 Azure CloudFile。能够加密 Azure Blob