Swagger Web 应用程序之后出现 Azure Blob 提取错误

Azure Blob fetch errror after for a Swagger web app

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

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

对于 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

如何解决问题?

因为你的容器是而不是public,所以你不能直接使用blob uri访问blob(像这样https://myblob.blob.core.windows.net/container/myfile.json)。它会抛出“文件不存在”的错误。

如果你想访问私有容器中的 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