2013-08-13 25 views
7

HttpTaskAsyncHandlerという独自の非同期HTTPハンドラを実装していて、非同期の&を使用すると完全非同期の状態を保ちます。AzureのBLOBを.NET 4.5非同期でクライアントにストリーミングする場合

私は青空の塊をクライアントに直接ストリームしたいです。クライアントを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サーバを解放しますストリーミングが行われている間に他のクライアント? (つまり、私が単一のサーバスレッドを持っていた場合)

ブロブを圧縮した状態(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); 
+1

WindowsAzure.Storage 2.1.0.0-rcは、非同期ネイティブサポートしています - http://www.nuget.org/packages/WindowsAzure.Storage –

答えて

2

現在のソリューションは非同期であり、サーバー要求スレッドを解放します。推奨事項はTaskFactory.FromAsyncです。my answer to your other questionを参照してください。

blobを圧縮したままにして(GZIP)、クライアントにContent-Encoding:gzipを使用してそれらを圧縮することはできますか?

私には分かりません。それは興味深い質問です。あなたはそれを別の質問として掲示したいかもしれません。

+0

GZIP圧縮BLOBについてのご質問は、答えは「はい」です。小さなファイル(JS、画像など)で自分自身で試してみましたが、試したさまざまなブラウザで問題なく動作しました。部分的なデータを読んでコンテンツをストリーミングし、全体のストリームをストリーミングする代わりにストリームをフラッシュするというシナリオでは、どのように動作するのか不明です。 –

+0

@ GauravMantri:ヘッダを手動で設定し、gzip形式のファイルをストリームしても問題ありません。 –

+1

私がしたやり方は、blobの 'Content-Encoding'プロパティを' gzip'に設定することでした。ストレージから直接ストリーミングされたとき、すべてが完全に機能しました。 –

関連する問題