Azure Blob 400关于创建容器的错误请求

时间:2013-10-25 21:38:23

标签: asp.net-mvc-4 azure azure-storage azure-storage-blobs blobstorage

我正在开发一个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

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

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

12 个答案:

答案 0 :(得分:87)

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

您说您的测试容器名为imageads-57905553-8585-4d7c-8270-be9e611eda81,但在您的代码中,您使用的是ImageAds-57905553-8585-4d7c-8270-be9e611eda81。注意资本化的差异。如果您将容器名称切换为全部小写,它将正常工作。


有关详细信息,请参阅Naming and Referencing Containers, Blobs, and Metadata处的容器名称下的#3:

3.容器名称中的所有字母必须为小写。

答案 1 :(得分:10)

为了扩展@kwill的答案,我实施了一个解决方案,根据Azure's rules for container naming将任何字符串转换为可接受的容器名称:

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());

答案 2 :(得分:7)

我实际上最终找到了问题。

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

答案 3 :(得分:5)

确保您的存储库和存储模拟器版本不同步&#34;不同步&#34;。我更新了我的库,但没有将模拟器更新到最新版本并得到了这个确切的情况。

答案 4 :(得分:4)

如果您刚刚更新 WindowsAzure.Storage nuget软件包,并且您的应用因 http错误400错误请求而开始崩溃:

在我的情况下,它发生在我更新到8.2.1并且我的本地模拟器是版本5.1时。

我的解决方案是:

  1. 转到Microsoft Azure SDK页面here.
  2. 搜索&#34; Azure存储模拟器&#34;并下载最新的存储模拟器。通常位于页面中间左侧的&#34;命令行工具&#34;节
  3. 安装最新的模拟器
  4. 你很高兴。
  5. 当我下载Storage Emulator 5.2并从5.1升级时,错误停止了。 这样的错误已经发生过好几次了。

    My humble request if anybody from Microsoft Azure Storage Emulator team reads this - 请添加对开发模式的检查,并使用如下信息抛出一个有意义的异常 - &#34;您已安装Azure存储模拟器版本X.Y.Z。要在Azure Emulator中使用当前的WindowsAzure.Storage库** V.V.V ,您需要从此链接安装模拟器的Z.Z.Z版本,或者您认为有用的任何内容。

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

答案 5 :(得分:3)

我刚刚解决了这个问题并修复了它。

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

答案 6 :(得分:3)

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

我刚刚改变了这个:

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

更新软件包后遇到此错误,但没有更新我的代码。我的问题是,自几年前我首次开始使用Azure存储以来,连接字符串的格式和内容已更改。确保从azure门户中的访问键选项中适当更新您的连接字符串。

在我的情况下:我在连接字符串中缺少此字符串: EndpointSuffix = core.windows.net

答案 9 :(得分:1)

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

答案 10 :(得分: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 "";
        }

答案 11 :(得分:0)

此问题的简单解决方案是,容器应始终使用小写字母。我遇到了同样的问题,将容器名称全部更改为小写后,该问题得以解决。