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);
WindowsAzure.Storage 2.1.0.0-rcは、非同期ネイティブサポートしています - http://www.nuget.org/packages/WindowsAzure.Storage –