2013-02-28 3 views
1

2 분 이내에 만료되는 SAS 토큰이 있습니다.BLOB 다운로드 중에 SAS 토큰이 만료됩니다.

SAS = AzureClient.GetCloudContainer().GetSharedAccessSignature(new SharedAccessPolicy() 
{ 
    SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(1) 
}, "readonly"); 
var sasCreds = new StorageCredentialsSharedAccessSignature(SAS); 
CloudStorageAccount _storageAccount = AzureClient.GetCloudStorageAccount(); 
CloudBlobClient sasBlobClient = new CloudBlobClient(_storageAccount.BlobEndpoint, sasCreds); 

CloudBlob sasBlob = sasBlobClient.GetBlobReference("blobname"); 

여기서 readonly는 정책 이름입니다.

지금 나는 다음과 같은 작업을하고있는 중이 야 :

using (BlobStream stream = sasBlob.OpenRead()) 
{      
    using (FileStream fileStream = File.OpenWrite(@"Smething.txt")) 
    { 
     BlobStreamReader(stream,fileStream); 
    } 
} 

private void BlobStreamReader(BlobStream blob,Stream OutputStream) 
{ 
    int buffersize = 4194304; // 4MB 
    byte[] data = new byte[buffersize]; 
    do 
    { 
     int bytesRead = blob.Read(data,0,buffersize); 
     if (bytesRead == 0) break; 
     OutputStream.Write(data,0,bytesRead); 
    } 
    while (true);    
} 

문제는 SAS가 만료 될 때 다운로드가 실패합니다. 나는 SAS 토큰이 인증을 위해서만 필요하다는 것을 알고 있었고 다운로드가 만기 시간과 함께 시작 되었다면 SAS가 만료 되더라도 다운로드가 계속됩니다.

답변

2

SAS 토큰은 인증을 위해서만 필요합니다. 그러나 BlobStream은 서버에서 더 많은 데이터가 필요할 때마다 새로운 요청을 발행합니다. 각 요청을 별도로 인증해야하고 전체 다운로드가 완료되기 전에 SAS 토큰이 만료되므로 실패 할 것으로 예상됩니다.

전체 BLOB를 다운로드하려면 서버에 대한 단일 요청 만 발행하고 전체 BLOB를 다운로드하기 때문에 DownloadToStream은 실제로 더 나은 대안입니다.