我正在使用HttpTaskAsyncHandler
实现自己的异步HTTP处理程序,并使用async & await使其完全异步化。
我想直接将Azure Blob流式传输到客户端。虽然我可以将客户端重定向到Blob URL并让他们直接下载,但假设我不想这样做(例如我的Blob是私有的)。
这是我目前的实现:
代码:
public async Task<bool> DownloadToStreamAsync(ICloudBlob blob, Stream stream)
{
bool blobFound = true;
IAsyncResult asyncResult = blob.BeginDownloadToStream(stream, null, null);
await Task.Factory.FromAsync(asyncResult, (r) =>
{
try
{
blob.EndDownloadToStream(r);
}
catch (StorageException)
{
blobFound = false;
}
});
return blobFound;
}
使用方法:
public override async Task ProcessRequestAsync(HttpContext context)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container1");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1.txt");
await DownloadToStreamAsync(blockBlob, context.Response.OutputStream);
}
这段代码是否完全异步,会释放我的HTTP服务器以处理其他客户端,同时进行流式传输?(如果我只有一个服务器线程)
是否可能保持blob压缩(GZIP)并使用Content-Encoding:gzip
让客户端进行解压缩?
更新:(截至Storage 2.1.0.0 RC)
现在原生支持异步。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container1");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1.txt");
await blockBlob.DownloadToStreamAsync(context.Response.OutputStream);