使用.NET 4.5异步将Azure blob异步流式传输到客户端,等待
本文关键字:异步 传输 客户端 等待 blob NET Azure 使用 | 更新日期: 2023-09-27 18:27:28
我正在用HttpTaskAsyncHandler
实现我自己的异步HTTP处理程序,并使用async&等待保持它完全异步。
我想将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
对其进行放气?
更新:(自存储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);
您当前的解决方案是异步的,将释放服务器请求线程。关于TaskFactory.FromAsync
的建议,请参阅我对您其他问题的回答。
是否可以保持Blob压缩(GZIP),并让客户端使用Content-Encoding对其进行放气:GZIP?
我不知道。这是一个有趣的问题;你可能想把它作为一个单独的问题发布。