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

hja*_*her 36 azure blobstorage azure-storage azure-storage-blobs asp.net-mvc-4

我正在开发一个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
    } 
Run Code Online (Sandbox Code Playgroud)

一旦if语句被删除,我就会收到以下异常:

  {"The remote server returned an error: (400) Bad Request."}
Run Code Online (Sandbox Code Playgroud)

我以为这是容器的名称,但我没有看到任何错误.连接字符串似乎创建了一个包含blob所有详细信息的良好存储空间.我不知所措.我研究了网络,每个人都说这是一个命名问题,但我发现它没有任何问题.

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

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

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

kwi*_*ill 89

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

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


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

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

  • 第3点为我工作.谢谢 !! (2认同)

Alb*_*ori 11

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

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

然后,当您尝试获取容器时,请先清理它:

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());
Run Code Online (Sandbox Code Playgroud)

  • 虽然这会起作用,但我通常会尽量避免这样的解决方案,因为你可能会遇到冲突(例如两个不同的名称都解析为同名) (2认同)

hja*_*her 7

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

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


nmi*_*026 5

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


Ogn*_*rov 5

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

就我而言,当我更新到 8.2.1 并且我的本地模拟器是版本 5.1 时,就会发生这种情况。

我的解决方案是这样的:

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

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

如果 Microsoft Azure 存储模拟器团队的任何人阅读此内容,我谨提出一个请求- 请添加对开发模式的检查,并抛出一个有意义的异常,其中包含消息,例如 - “您安装了 Azure 存储模拟器版本 XYZ。为了使用当前的 WindowsAzure.Storage带有 Azure 模拟器的VVV库,您需要从此链接安装模拟器的 ZZZ 版本”。或者任何你认为有用的东西。

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