tal*_*kol 9 c# azure azure-storage-blobs async-await .net-4.5
我正在实现我自己的异步HTTP处理程序,HttpTaskAsyncHandler
并使用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;
}
Run Code Online (Sandbox Code Playgroud)
用法:
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);
}
Run Code Online (Sandbox Code Playgroud)
这段代码确实是完全异步的,并且会在流式传输时释放我的HTTP服务器以处理其他客户端吗?(即如果我有一个服务器线程)
是否可以保持blob压缩(GZIP)并让客户端使用Content-Encoding: gzip
?
更新:(从存储2.1.0.0 RC开始)
Async现在支持本机.
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);
Run Code Online (Sandbox Code Playgroud)
您当前的解决方案是异步的,并将释放服务器请求线程。请参阅我对您其他问题的回答以获取相关建议TaskFactory.FromAsync
。
是否可以保持 blob 压缩 (GZIP) 并让客户端使用 Content-Encoding: gzip 缩小它们?
我不知道。这是一个有趣的问题;您可能想将其作为单独的问题发布。
归档时间: |
|
查看次数: |
5858 次 |
最近记录: |