37

我正在开发一个 ASP.Net MVC 4 应用程序,并且我正在使用 Azure Blob 来存储我的用户要上传的图像。我有以下代码:

 var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

 var blobStorage = storageAccount.CreateCloudBlobClient();
 //merchantKey is just a GUID that is asociated with the merchant
 var containerName = ("ImageAds-" + merchant.merchantKey.ToString()).ToLower();
 CloudBlobContainer container = blobStorage.GetContainerReference(containerName);
 if (container.CreateIfNotExist())
    {
       //Upload the file
    } 

一旦 if 语句被执行,我就会得到以下异常:

  {"The remote server returned an error: (400) Bad Request."}

我以为这是容器的名称,但我看不出有什么问题。连接字符串似乎为 blob 创建了一个包含所有详细信息的良好存储。我不知所措。我研究了网络,每个人都说这是一个命名问题,但我找不到任何问题。

我使用的测试容器名称: imageads-57905553-8585-4d7c-8270-be9e611eda81

容器具有以下 uri:{http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

更新: 我已将容器名称更改为 just image,但仍然遇到相同的异常。开发连接字符串如下:<add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

4

12 回答 12

93

正如您通过研究发现的那样,问题在于名称。

您说您的测试容器已命名imageads-57905553-8585-4d7c-8270-be9e611eda81,但在您的代码中您正在使用ImageAds-57905553-8585-4d7c-8270-be9e611eda81. 注意大小写的不同。如果您将容器名称切换为全小写,它将正常工作。


有关详细信息,请参阅命名和引用容器、Blob 和元数据中的容器名称下的 #3 :

3. 容器名称中的所有字母必须小写。
于 2013-10-25T22:02:55.890 回答
11

为了扩展@kwill 的答案,我根据Azure 的容器命名规则实现了一个将任何字符串转换为可接受的容器名称的解决方案:

public static string ToURLSlug(this string s)
{
    return Regex.Replace(s, @"[^a-z0-9]+", "-", RegexOptions.IgnoreCase)
        .Trim(new char[] { '-' })
        .ToLower();
}

然后,当您尝试获取容器时,请先将其清理干净:

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());
于 2015-02-28T23:51:06.180 回答
7

我实际上最终发现了问题。

我的问题是 blob 存储模拟器无法启动(其他模拟器会启动而我错过了 blob)。问题最终是端口 10000(默认 blob 模拟器端口)已被另一个软件使用。我使用Netstatcmd 工具查看它是哪个软件,杀死它,它现在像一个魅力一样工作!!!感谢大家!!

于 2013-10-25T22:43:44.470 回答
5

Make sure your versions of the storage libraries and storage emulator aren't "out of sync". I updated my libraries but didn't update the emulator to the latest version and got this exact situation.

于 2016-07-27T23:03:27.220 回答
4

如果您刚刚更新WindowsAzure.Storage nuget 包并且您的应用程序开始崩溃并出现 http 错误 400 错误请求

就我而言,它发生在我更新到 8.2.1 并且我的本地模拟器是 5.1 版时。

我的解决方案是这样的:

  1. 在此处转到 Microsoft Azure SDK 页面
  2. 搜索“Azure Storage Emulator”并下载最新的存储模拟器。通常在“命令行工具”部分左侧的页面中间
  3. 安装最新的模拟器
  4. 你已准备好出发。

当我下载 Storage Emulator 5.2 并从 5.1 升级时,错误停止了。这样的错误已经在我身上发生过好几次了。

如果 Microsoft Azure Storage Emulator 团队中的任何人阅读此内容,我的谦虚请求- 请添加对开发模式的检查并抛出一个有意义的异常消息,例如 - “您已安装 Azure Storage Emulator 版本 XYZ。为了使用当前的 WindowsAzure.Storage库**VVV with Azure Emulator,您需要从此链接安装模拟器的 ZZZ 版本。** 或您认为有用的任何内容。

这种问题已经浪费了我几个小时的时间,我想全世界成千上万的开发人员也遇到了同样的情况,但这个例外仍然存在 - 超过 4 年!

于 2017-08-04T08:39:17.810 回答
3

我刚遇到这个问题并修复了它。

我的容器名称很好,但我不小心将连接字符串中的 AccountName 参数大写了。这导致了我的400。

于 2016-10-06T16:53:22.663 回答
3

我的是一个愚蠢的命名问题!显然,我们不允许在名称中使用大写字母

我刚刚改变了这个:

CloudBlobContainer container = blobClient.GetContainerReference("MyContainer");
container.CreateIfNotExists();

CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
于 2018-04-20T11:49:57.640 回答
2

更新包后我遇到了这个错误,但不是我的代码。我的问题是,自从几年前我第一次开始使用 Azure 存储以来,连接字符串的格式和内容发生了变化。确保从 azure 门户中的访问密钥选项适当地更新您的连接字符串。

就我而言:我的连接字符串中缺少这个: EndpointSuffix=core.windows.net

于 2019-02-07T15:07:31.273 回答
2

从实验来看,容器名称似乎也必须始终为小写。内部必须有一个隐式转换,这会导致它以小写形式创建原始 blob,但在 createifnotexists(async) 中比较它时不会。但是当它重新创建它时,它会再次降低它的大小写,这会导致冲突。这是一个最好的猜测。

于 2016-09-29T23:53:07.513 回答
1

有必要在异常中查看 httpstatusmessage:在我的情况下,错误是因为请求的 URI 不代表服务器上的任何资源。

所以我看到我的BlobContainerName不包含正确的容器(或不存在)

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

我见过的其他情况是容器名称错误。blobcontainername 必须是“mycontainer1”或“mycontainer2”等名称

这里是添加容器的代码

try
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);

            // Create the blob client.
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference(BlobContainerName);

            container.CreateIfNotExists();

           //creo se non esiste e aggiungo i permessi
            BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
            containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
            container.SetPermissions(containerPermissions);

            // Retrieve reference to a blob named "myblob".
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(Filename); 

            blockBlob.UploadFromStream(inFileUpload);
        }
        catch (Exception ex)
        {
            return "";
        }
于 2014-09-21T14:59:16.380 回答
1

我尝试重现您的问题,但看起来您使用的是旧版本的客户端库,因为container.CreateIfNotExist()现在是container.CreateIfNotExists(). 您是否考虑过升级最新的客户端版本(2.1)?

于 2013-10-25T22:36:10.607 回答
1

这个问题的简单解决方案是,容器应该总是小写。我有同样的问题,在将容器名称更改为小写后得到解决。

于 2019-02-17T11:05:37.207 回答