我开始加密我的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;
}
答案 0 :(得分:0)
我用异步调用替换了所有与blob相关的同步调用,尤其是下载调用。也从stream更改为bytearray,但我不认为这是相关的:
await blob.DownloadToByteArrayAsync(byteArray, 0, null, options, null);