Sto implementando il mio gestore HTTP asincrono con HttpTaskAsyncHandler
e utilizzando async & attendi di mantenerlo completamente asincrono.Streaming di un BLOB di Azure sul client in modo asincrono con .NET 4.5 async, attendere
Desidero trasmettere un blob azzurro direttamente al client. È vero che posso reindirizzare il client all'URL del blob e chiedergli di scaricarlo direttamente, ma supponiamo di non volerlo fare (il mio blob è privato, ad esempio).
Questo è il mio attuale implementazione:
Codice:
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;
}
Usage:
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);
}
È questo codice infatti completamente asincrono e libererà il mio server HTTP per gestire altri clienti mentre lo streaming ha luogo? (cioè se avessi un singolo thread del server)
È possibile mantenere i BLOB compressi (GZIP) e farli sgonfiare dal client utilizzando Content-Encoding: gzip
?
Update: (come di stoccaggio 2.1.0.0 RC)
Async ora supportato in modo nativo.
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 ora supporta nativamente asincrona - http://www.nuget.org/packages/WindowsAzure.Storage –