c# 4.0 - SAS令牌在Blob下载时过期



我有一个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");

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

SAS令牌仅用于身份验证是正确的。但是,在您的示例中,每当需要从服务器获取更多数据时,BlobStream将发出一个新的请求。由于每个请求都需要单独进行身份验证,并且您的SAS令牌在整个下载完成之前过期,因此预计会失败。

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

最新更新