微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swagger Web 应用程序的 Azure Blob 提取错误

如何解决Swagger Web 应用程序的 Azure Blob 提取错误

我有一个 web 应用程序,它生成像 Swagger 这样的文档,它尝试获取 blob 内容(例如 json)来呈现 API 定义。

存储帐户容器是一个私有容器,我设置了如下 CORS 规则:

enter image description here

对于 blob 检索:

public BlobStorageService(string connectionString)
{
  if (string.IsNullOrWhiteSpace(connectionString))
  {
    throw new ArgumentException($"'{nameof(connectionString)}' cannot be null or whitespace",nameof(connectionString));
  }

  mBlobServiceClient = new BlobServiceClient(connectionString);
}

public async Task<string> GetBlobUri(string blobName,string tenant)
{
  var blobContainerClient = await GetBlobContainerClient(tenant).ConfigureAwait(true);
  var blockBlobReferance = blobContainerClient.GetBlockBlobClient(blobName);
  return blockBlobReferance.Uri.ToString();
}

private async Task<BlobContainerClient> GetBlobContainerClient(string tenant)
{
  ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  var containerClient = mBlobServiceClient.GetBlobContainerClient(tenant);
  if (!await containerClient.ExistsAsync().ConfigureAwait(true))
  {
    containerClient = mBlobServiceClient.GetBlobContainerClient(Constants.cDefaultContainerName);
  }

  if (!await containerClient.ExistsAsync().ConfigureAwait(true))
  {
    throw new BlobContainerNotFoundException(tenant);
  }

  return containerClient;
}

我试着得到:

options.SwaggerEndpoint((await myBlobManager.GetBlobUri("myfile.json","container"),"Service namespace for myfile.json"); // here I get fetch error

enter image description here

如何解决问题?

解决方法

由于您的容器非公开,因此您无法使用 blob uri(例如 https://myblob.blob.core.windows.net/container/myfile.json)直接访问 blob。它会抛出“文件不存在”错误。

如果要访问私有容器中的 blob,应在 blob uri 的末尾附加 sas token。为此,您应该修改 GetBlobUri 方法中的代码,如下所示:

public async Task<string> GetBlobUri(string blobName,string tenant)
{
  var blobContainerClient = await GetBlobContainerClient(tenant).ConfigureAwait(true);
  var blockBlobReferance = blobContainerClient.GetBlockBlobClient(blobName);

  //for blobs in private container,you should use code below to generate a sas token
  var blob_sas_uri = blockBlobReferance.GenerateSasUri(BlobSasPermissions.All,new DateTimeOffset(DateTime.Now.AddDays(1))).ToString();

  return blob_sas_uri;
}

另一种方式是,您可以set your container access level to public

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。