C# 使用.NET 4.5 async将Azure blob异步流式传输到客户端,等待

C# 使用.NET 4.5 async将Azure blob异步流式传输到客户端,等待,c#,azure,.net-4.5,async-await,azure-storage-blobs,C#,Azure,.net 4.5,Async Await,Azure Storage Blobs,我正在使用httptasksynchhandler实现我自己的异步HTTP处理程序,并使用async&await使其完全异步 我想将azure blob直接流式传输到客户端。的确,我可以将客户端重定向到blob URL并让他们直接下载,但假设我不想这样做(例如,我的blob是私有的) 这是我当前的实现: 代码: public async Task<bool> DownloadToStreamAsync(ICloudBlob blob, Stream stream) {

我正在使用
httptasksynchhandler
实现我自己的异步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)并让客户端使用
内容编码: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)并让客户端使用内容编码:GZIP对其进行压缩


我不知道。这是一个有趣的问题;您可能希望将其作为一个单独的问题发布。

WindowsAzure.Storage 2.1.0.0-rc现在本机支持异步-关于您关于GZIP压缩blob的问题,答案是肯定的。我自己也尝试过使用较小的文件(如JS、图像等),在我尝试过的各种浏览器中效果都很好。不确定在通过读取部分数据并刷新流而不是流式处理整个blob来流式处理内容的情况下,它将如何工作。@GauravMantri:所以您只需手动设置标题,然后流式处理预压缩的文件,工作正常吗?我的方法是将blob上的
Content Encoding
属性设置为
gzip
,当它直接从存储流式传输时,一切都很正常。客户端当前不支持压缩。当然,您可以设置标题,大多数浏览器都会支持它,但是如果通过客户端下载,您将检索压缩的内容,而不是未压缩的数据。这是我们正在跟踪的功能请求。