Blob下载时,SAS令牌即将到期

时间:2013-02-28 10:46:28

标签: c#-4.0 azure-storage-blobs blobstorage

我有一个SAS令牌,它将在2分钟后到期。

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过期,下载也会继续。

1 个答案:

答案 0 :(得分:2)

只有身份验证才需要SAS令牌。但是,在您的情况下,BlobStream将在需要来自服务器的更多数据时发出新请求。由于每个请求都需要单独进行身份验证,并且您的SAS令牌在整个下载完成之前到期,因此预计会失败。

如果你想下载整个blob,DownloadToStream实际上是一个更好的选择,因为它只会向服务器发出一个请求,然后下载整个blob。