gpt4 book ai didi

c# - 如何使用 SAS token 通过 C# API 列出容器中的 Blob

转载 作者:行者123 更新时间:2023-12-03 01:19:32 31 4
gpt4 key购买 nike

我正在使用 SAS token 通过 C# API 访问 Azure Blob 存储。我可以在容器中成功创建新的 blob,并且根据 blob 的名称,我可以读取该 blob 并获取内容。但是,我无法列出容器中的 blob,因为收到 InvalidURl 错误:请求的 URI 不代表服务器上的任何资源。

我对所有三个请求(上传、下载和列表)使用相同的 sas URI。

我使用以下代码生成 sas URI:

if (containerClient.CanGenerateSasUri)
{
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerClient.Name,
Resource = "c"
};

if (storedPolicyName == null)
{
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
sasBuilder.SetPermissions(BlobContainerSasPermissions.All);
}
else
{
sasBuilder.Identifier = storedPolicyName;
}

Uri sasUri = containerClient.GenerateSasUri(sasBuilder);
}

我尝试使用以下代码列出 blob 的名称:

    var serviceClient = new BlobServiceClient(sasUri);
var containerClient = serviceClient.GetBlobContainerClient(container);
var blobs = containerClient.GetBlobsByHierarchyAsync();

await foreach (var blob in blobs)
{
if (blob.IsBlob)
{
blobNames.Add(blob.Blob.Name);
}
}

如果我使用连接字符串(而不是 sas URI)创建 BlobServiceClient,则此代码可以工作,并且可以列出我使用 sas URI 上传的 blob,但使用 sas URI 会失败并显示 InvalidURL(即使是我刚刚用来在容器中创建 blob 的 sas token 相同,并且它有权列出容器中的 blob)。

如果我硬编码一个已知的文件名,我可以使用 sas containerClient 创建一个工作的 BlobClient:

    var blobClient = containerClient.GetBlobClient("blobname");
if (await blobClient.ExistsAsync())
{
var stream = await blobClient.DownloadStreamingAsync();
return stream.Value.Content;
}

我需要做什么才能让 List 操作与 sas token 一起使用?任何指出我所缺少的内容的指示都非常感谢!

最佳答案

您遇到问题的原因是您使用 Blob 容器 SAS URI 创建 BlobServiceClient,并且当您使用服务客户端创建 BlobContainerClient 实例时,容器名称会重复两次。

可能的解决方案:

  1. 使用容器 SAS URL 直接创建 BlobContainerClient 实例。你可以这样做:
containerClient = new BlobContainerClient(sasUri);
  • 仅使用 SAS token (而不是 SAS URL)和帐户端点创建 BlobServiceClient 实例。你可以这样做:
  • var endpoint = $"{uri.Scheme}://{uri.Host}";
    var sasToken = uri.Query;
    var credentials = new AzureSasCredential(sasToken);
    var serviceClient = new BlobServiceClient(new Uri(endpoint), credentials);
    var containerClient = serviceClient.GetBlobContainerClient(container);
    ...
    ...rest of your code
    ...

    关于c# - 如何使用 SAS token 通过 C# API 列出容器中的 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72152849/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com