2013-08-13 3 views
7

HttpTaskAsyncHandler으로 자체 비동기 HTTP 처리기를 구현하고 비동기 &을 사용하면 완전히 비동기로 유지할 수 있습니다..NET 4.5 비동기와 비동기 적으로 클라이언트에 Azure BLOB 스트리밍

푸른 하늘을 클라이언트에 직접 스트리밍하고 싶습니다. 클라이언트를 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는 이제 async를 기본적으로 지원합니다 - http://www.nuget.org/packages/WindowsAzure.Storage –

답변

2

현재 솔루션은 비동기식이며 서버 요청 스레드를 확보합니다. 권장 사항은 TaskFactory.FromAsync 인 경우 my answer to your other question을 참조하십시오.

blob을 압축 된 상태로 유지하고 (GZIP) 클라이언트가 Content-Encoding : gzip을 사용하여 압축 할 수 있습니까?

나는 잘 모른다. 흥미로운 질문입니다. 별도의 질문으로 게시하는 것이 좋습니다.

+0

GZIP 압축 BLOB에 관한 질문에 대해서는 대답은 yes입니다. 작은 파일 (예 : JS, 이미지 등)을 사용하여 직접 시도했지만 시도한 여러 브라우저에서 정상적으로 작동했습니다. 부분 데이터를 읽고 전체 BLOB를 스트리밍하는 대신 스트림을 플러시하여 콘텐츠를 스트리밍하는 시나리오에서 어떻게 작동하는지 잘 모르겠습니다. –

+0

@ GauravMantri : 따라서 헤더를 수동으로 설정 한 다음 미리 압축 된 파일을 스트리밍하면됩니다. –

+1

내가 한 방법은 blob의'Content-Encoding' 속성을'gzip'으로 설정하는 것이었고, 저장소에서 직접 스트리밍 할 때 모든 것이 완벽하게 작동했습니다. –