2013-02-28 2 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"); 

Где только имя политики.

Теперь я делаю следующие операции:

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 на самом деле является лучшей альтернативой, поскольку он будет выдавать только один запрос на сервер, а затем загружать весь блокнот.