2013-08-13 13 views
7

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); 
+1

WindowsAzure.Storage 2.1.0.0-rc ora supporta nativamente asincrona - http://www.nuget.org/packages/WindowsAzure.Storage –

risposta

2

La soluzione corrente è asincrona e libera il thread di richiesta del server. Vedi my answer to your other question per le raccomandazioni su TaskFactory.FromAsync.

E 'possibile mantenere le macchie compressi (GZIP) e il client sgonfiare utilizzando Content-Encoding: gzip?

Non ne ho idea. Questa è una domanda interessante; potresti voler postarlo come una domanda separata.

+0

Per quanto riguarda le tue domande su GZIP blob compressa, la risposta è sì. L'ho provato io stesso con file più piccoli (come JS, immagini ecc.) E ha funzionato bene in vari browser che ho provato. Non sei sicuro di come funzionerebbe in uno scenario in cui stai trasmettendo contenuti leggendo dati parziali e svuotandoli dallo stream anziché eseguire lo streaming dell'intero blob. –

+0

@GauravMantri: Quindi basta impostare l'intestazione manualmente e quindi eseguire lo streaming del file pre-gzip e ciò funziona correttamente? –

+1

Il modo in cui ho fatto è stato impostare la proprietà 'Content-Encoding' su blob su' gzip' e quando è stata trasmessa direttamente dallo storage, tutto ha funzionato perfettamente. –

Problemi correlati