从 Uri 和 BlobServiceClient 创建 Azure BlobClient

Creating Azure BlobClient from Uri and BlobServiceClient

在 Azure 存储 v12 SDK 中,如何使用 Blob URI 和 BlobServiceClient 创建 blob 客户端?

在 v11 中,我们可以通过以下方式做到这一点:

var cloudBlockBlob = new CloudBlockBlob(<Blob URI>, <Cloud Blob Client>);

我已经设法通过以下 hacky 方式做到这一点,我必须通过最初创建 blobClient 对象来获取容器和客户端名称。我无法使用初始客户端访问 blob,因为我收到 AuthenticationFailed 错误。

var sasUri = _blobServiceClient.GenerateAccountSasUri(
    AccountSasPermissions.Read, DateTimeOffset.UtcNow.AddDays(10),
        AccountSasResourceTypes.Object);
var sasCredential = new AzureSasCredential(sasUri.ToString());

// this is not valid as I get an Authentication Exception if I try to access from here
var blobClient = new BlobClient(blobUri, sasCredential); 

BlobContainerClient blobContainerClient = 
    _blobServiceClient.GetBlobContainerClient(blobClient.BlobContainerName);
blobClient = blobContainerClient.GetBlobClient(blobClient.Name);
BlobDownloadInfo blobDownloadInfo = await blobClient.DownloadAsync(cancellationToken);

我很确定我在这里做错了什么并且有更好的方法来做到这一点。我怎样才能在 v12 中正确实现这一点?

只需更改这行代码:

var sasCredential = new AzureSasCredential(sasUri.ToString());

var sasCredential = new AzureSasCredential(sasUri.ToString().Split('?')[1]);

Ivan 的回答是正确的。本质上问题是 AzureSasCredential 需要 SAS 令牌而不是 URL.

另一种从 SAS URL 获取令牌的方法是:

var sasCredential = new AzureSasCredential(sasUri.Query);