应用加密后 Azure Blob 超时
Azure Blob timeouts after encryption was applied
我开始加密 我的 Azure blob。现在我 偶尔 得到 500 - 在请求暂停大约 30 秒后,请求在 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;
}
我用异步调用替换了所有与同步 blob 相关的调用,尤其是下载调用。也从流更改为字节数组,但我认为这不相关:
await blob.DownloadToByteArrayAsync(byteArray, 0, null, options, null);
我开始加密 我的 Azure blob。现在我 偶尔 得到 500 - 在请求暂停大约 30 秒后,请求在 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;
}
我用异步调用替换了所有与同步 blob 相关的调用,尤其是下载调用。也从流更改为字节数组,但我认为这不相关:
await blob.DownloadToByteArrayAsync(byteArray, 0, null, options, null);