2012-02-05 2 views
0

BLOB (잠재적으로 1GB)를 청크로 다운로드하여 Silverlight 응용 프로그램에서 사용하기 위해 오프셋 byte[]으로 사용할 수있는 WCF 서비스를 제공하도록 요청 받았습니다. 본질적으로 연산에는 오프셋 할 바이트 수와 반환 할 최대 바이트 수에 대한 매개 변수가 있습니다. 아무 것도 복잡하지 않습니다.WCF를 사용하여 청녹색 BLOB를 청크로 다운로드

내가 지금까지 가지고있는 코드는 다음과 같습니다

[OperationContract] 
public byte[] Download(String url, int blobOffset, int bufferSize) 
{ 
    var blob = new CloudBlob(url); 

    using(var blobStream = blob.OpenRead()) 
    { 
     var buffer = new byte[bufferSize]; 
     blobStream.Seek(blobOffset, SeekOrigin.Begin); 
     int numBytesRead = blobStream.Read(buffer, 0, bufferSize); 

     if (numBytesRead != bufferSize) 
     { 
      var trimmedBuffer = new byte[numBytesRead]; 
      Array.Copy(buffer, trimmedBuffer, numBytesRead); 
      return trimmedBuffer; 
     } 
     return buffer; 
    } 
} 

내가하고 (상대적으로 작은 파일 < 2MB의에 불구하고)이 테스트 한이 작업을 수행하지만, 내 질문은 :

  • 누군가가 수 코드 개선을 제안 하시겠습니까?
  • 요구 사항이 더 나은 방법이 있습니까?

답변

0

blob을 바이트 배열 대신 스트림으로 반환 할 수 있습니다. 여기에 관련된 질문에 코드 샘플이 있습니다. Returning Azure BLOB from WCF service as a Stream - Do we need to close it?

참고 스트림을 반환 할 때 사용할 수있는 바인딩에 대한 몇 가지 제한 사항이 있습니다.

+0

앞서 언급했듯이 blob을 스트림이 아닌 byte [] 청크로 반환해야합니다. 아니면 내가 무슨 말을 잘못 이해 했니? – Digbyswift

+0

스트림 대신 바이트 배열로 blob을 소비해야하는 이유는 무엇입니까? –

+0

나는 그렇지 않다. 제 의뢰인이 요청했습니다. 아마도 그들은 이미 이것을 요구하는 해결책을 가지고 있습니다. 나는 단지 동일한 세션에서가 아니라, 부분적으로 얼룩을 다운로드 할 수있는 유연성을 원한다고 가정 할 수 있습니다. – Digbyswift

2
    using (BlobStream blobStream = blob.OpenRead()) 
        { 
         bool getSuccess = false; 
         int getTries = 0; 
         rawBytes = new byte[blobStream.Length]; 
         blobStream.Seek(0, SeekOrigin.Begin); 
         int blockSize = 4194304; //Start at 4 mb per batch 
         int index = 0; 
         int documentSize = rawBytes.Length; 
         while (getTries <= 10 && !getSuccess) 
         { 
          try 
          { 
           int batchSize = blockSize; 
           while (index < documentSize) 
           { 
            if ((index + batchSize) > documentSize) 
             batchSize = documentSize - index; 
            blobStream.Read(rawBytes, index, batchSize); 
            index += batchSize; 
           } 
           getSuccess = true; 
          } 
          catch (Exception e) 
          { 
           if (getTries > 9) 
            throw e; 
           else 
            blockSize = blockSize/2; // Reduce by half for each attempt 
          } 
          finally 
          { getTries++; } 
         } 
        } 
관련 문제