2013-02-28 65 views
1

我有一個SAS令牌,將在2分鐘內過期。SAS令牌過期,而Blob下載

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,DownloadToStream實際上是一個更好的選擇,因爲它只會向服務器發出一個請求,然後下載整個blob。