无法通过其URL访问LocalStorage中的Azure blob

时间:2017-11-01 19:25:45

标签: c# azure azure-storage-blobs

我正在创建一个Web应用程序,作为我的任务的一部分。任务是将音频剪辑上传到ASP页面,然后Web作业将从中生成20秒样本,然后显示在同一页面上。我最终需要将其部署到Azure,但目前我正在使用Azure存储模拟器的本地存储。

页面正确加载,音频正在上传到Blob容器,并且正在生成样本并将其放置在正确的文件夹中。然而,样本没有加载到播放器中,我无法通过浏览器访问这些样本,即使使用我正在读取存储中的blob的URL。

Blobs in Local Storage

当我将该URL输入浏览器(应用程序和Web作业都运行)时,我显示以下消息:

Resource Not Found

我的第一直觉是我没有访问容器所需的权限。但是据我所知,权限已经正确配置。下面是我的BlobStorageService类,它处理容器的权限:

namespace Sampler
{
    public class BlobStorageService
    {
        public CloudBlobContainer getCloudBlobContainer()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse
                (ConfigurationManager.ConnectionStrings["AzureStorage"].ToString());

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("audiostorage");

            if (container.CreateIfNotExists())
            {
                BlobContainerPermissions permissions = container.GetPermissions();
                permissions.PublicAccess = BlobContainerPublicAccessType.Container;
                container.SetPermissions(permissions);
            }
            return container;
        }
    }

因此,据我所知,整个容器的权限应该是Public,而我使用的代码直接来自Microsoft Docs。对于下一步行动的任何建议都非常感谢并且很乐意发布您可能需要查看的更多代码。

1 个答案:

答案 0 :(得分:1)

您的代码似乎存在逻辑问题。如果容器已存在,则容器的许可将不公开,默认为私有。如果我们尝试在私有容器中列出blob,则会发现未找到问题。请尝试使用以下代码。或者我们可以使用Microsoft Azure Storage Exploer将容器设置为公共并再次尝试。

 public CloudBlobContainer getCloudBlobContainer()
  {
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ToString());
      CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
      CloudBlobContainer container = blobClient.GetContainerReference("audiostorage");
      container.CreateIfNotExists(); // remove the if condition
      BlobContainerPermissions permissions = container.GetPermissions();
      permissions.PublicAccess = BlobContainerPublicAccessType.Container;
      container.SetPermissions(permissions);  
      return container;
   }