应用加密后的Azure Blob超时

时间:2016-05-10 14:22:15

标签: c# azure azure-storage-blobs

我开始加密我的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;
    }

1 个答案:

答案 0 :(得分:0)

我用异步调用替换了所有与blob相关的同步调用,尤其是下载调用。也从stream更改为bytearray,但我不认为这是相关的:

await blob.DownloadToByteArrayAsync(byteArray, 0, null, options, null);