2013-08-13 44 views
7

Tôi đang triển khai trình xử lý HTTP không đồng bộ của riêng mình với HttpTaskAsyncHandler và sử dụng async & đang chờ để giữ nó hoàn toàn không đồng bộ.Truyền một blob Azure tới máy khách không đồng bộ với .NET 4.5 async, chờ

Tôi muốn phát trực tiếp một đốm màu xanh dương trực tiếp cho khách hàng. Đúng là tôi có thể chuyển hướng máy khách đến URL blob và yêu cầu họ tải nó trực tiếp, nhưng giả sử tôi không muốn làm điều đó (ví dụ blob của tôi là riêng tư).

Đây là thực hiện hiện tại của tôi:

Code:

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; 
    } 

Cách sử dụng:

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); 
    } 

Là mã này thực sự hoàn toàn không đồng bộ và sẽ giải phóng máy chủ HTTP của tôi để xử lý khách hàng khác trong khi phát trực tuyến diễn ra? (ví dụ: nếu tôi có một luồng máy chủ duy nhất)

Có thể giữ cho các đốm màu được nén (GZIP) và yêu cầu khách hàng làm giảm chúng bằng cách sử dụng Content-Encoding: gzip không?

Cập nhật: (tính lưu trữ 2.1.0.0 RC)

Async hiện được hỗ trợ natively.

 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 hiện hỗ trợ async nguyên bản - http://www.nuget.org/packages/WindowsAzure.Storage –

Trả lời

2

Giải pháp hiện tại của bạn không đồng bộ và sẽ giải phóng chuỗi yêu cầu máy chủ. Xem my answer to your other question để biết các đề xuất lại TaskFactory.FromAsync.

Có thể giữ cho các đốm màu được nén (GZIP) và yêu cầu khách hàng làm xáo trộn chúng bằng cách sử dụng Mã hóa nội dung: gzip không?

Tôi không biết. Đó là một câu hỏi thú vị; bạn có thể muốn đăng nó như một câu hỏi riêng.

+0

Về câu hỏi của bạn về blob nén GZIP, câu trả lời là có. Tôi đã thử nó bản thân mình với các tập tin nhỏ hơn (như JS, hình ảnh vv) và nó làm việc tốt trong các trình duyệt khác nhau tôi đã cố gắng. Bạn không chắc chắn nó sẽ hoạt động như thế nào trong một kịch bản mà bạn đang phát trực tuyến nội dung bằng cách đọc một phần dữ liệu và xóa dữ liệu đó xuống luồng thay vì truyền toàn bộ blob. –

+0

@GauravMantri: Vì vậy, bạn chỉ cần đặt tiêu đề theo cách thủ công và sau đó truyền tệp đã được nén trước và hoạt động tốt? –

+1

Cách tôi đã làm là đặt thuộc tính 'Content-Encoding' trên blob thành' gzip' và khi nó được truyền trực tiếp từ bộ nhớ, mọi thứ hoạt động hoàn hảo. –