29

我正在開發一個ASP.Net MVC 4應用程序,我正在使用Azure Blob來存儲用戶將要上傳的圖像。我有以下代碼:Azure Blob 400對容器創建的不良要求

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語句excecuted我得到以下異常:

{"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}

UPDATE: 我已經改變了容器名稱只是image和我仍然得到同樣的異常。開發連接字符串如下:<add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

回答

6

我真的最終發現了問題。

我的問題是blob存儲模擬器無法啓動(其他模擬器會啓動,我錯過了blob)。問題的結果是端口10000(默認blob仿真器端口)已被其他軟件使用。我使用了Netstat cmd工具來查看它是哪個軟件,殺死它,現在它像一個魅力一樣工作!感謝大家!!

+0

您在Netstat中使用了哪些命令? – nmit026

74

正如您在研究中發現的,問題在於名稱。

你說你的測試容器被命名爲imageads-57905553-8585-4d7c-8270-be9e611eda81,但在你的代碼中你使用的是ImageAds-57905553-8585-4d7c-8270-be9e611eda81。注意大小寫的差異。如果將您的容器名稱切換爲全部小寫,它將正常工作。


欲瞭解更多信息,請參閱#3下的容器名稱爲Naming and Referencing Containers, Blobs, and Metadata

3.容器的名稱所有英文字母必須小寫。
+0

嗨,感謝您的回覆。在該語句結尾處有一個'.ToLower()',將整個字符串轉換爲小寫。在任何一種情況下,我想也許我錯過了一些東西,然後我去了一個頭,並將名稱更改爲靜態'圖像',並且我有同樣的例外。 – hjavaher

+2

第3點爲我工作。謝謝 !! –

+0

在我的情況下,我的容器名稱太短(它必須至少有3個字符長) – Illidan

1

我試圖重現您的問題,但它看起來像您使用的是舊版本的客戶端庫,因爲container.CreateIfNotExist()現在是container.CreateIfNotExists()。您是否考慮升級最新的客戶端版本(2.1)?

+0

嗨,其實我只是發現問題,這不是問題。但我沒有意識到有一個更新的(實際上更新的方法)可用包並升級了它。 – hjavaher

+4

我的問題是模擬器已經過時 - 安裝最新的模擬器(我不需要移動到整個2.7 SDK)就解決了這個問題。 –

0

有必要查看異常中的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 ""; 
     } 
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()); 
+1

儘管這會起作用,但我通常會盡量避免這樣的解決方案,因爲您最終可能會碰撞(例如,兩個名稱均解析爲相同名稱的不同名稱) –

5

確保您的存儲庫和存儲仿真器的版本不是「不同步」。我更新了我的庫,但沒有更新模擬器到最新版本,並得到了確切的情況。

+0

謝謝!通過NuGet升級WindowsAzure.Storage軟件包,並得到這個錯誤。卸載並下載最新版本的Azure存儲模擬器,這清除了錯誤,並讓一切正常工作。 –

2

從實驗看起來好像容器名稱必須始終也爲小寫。內部必須有一個隱式轉換,這會導致它以小寫形式創建原始blob,但不會在createifnotexists(async)中將其比較。但是,當它重新創建它時,會再次降低它,這會導致衝突。這是一個最好的猜測。

2

我只是有這個問題,並固定它。

我的容器名稱是很好,但我不小心有帳戶名參數,我的連接字符串大寫。這導致了我400

4

如果你有剛剛更新WindowsAzure.Storage NuGet包和你的應用程序開始與HTTP錯誤400錯誤的請求崩潰:

在我的情況下,它發生在我更新到8.2.1,我的本地模擬器是5.1版本。

我的解決辦法是這樣的:

  1. 轉到微軟的Azure SDK頁here.
  2. 搜索 「Azure存儲模擬器」,並下載最新的存儲模擬器。通常在「命令行工具」部分左側的頁面中間部分
  3. 安裝最新的仿真器
  4. 你很好走。

當我下載存儲模擬器5.2和5.1升級錯誤停止。 這樣的錯誤已經發生過幾次了。

My humble request if anybody from Microsoft Azure Storage Emulator team reads this - 請添加對發展模式的支票,並拋出帶有類似消息的有意義的異常 - 「你必須安裝Azure存儲模擬器版本XYZ爲了使用目前WindowsAzure.Storage庫** VVV與Azure上。您需要從該鏈接安裝模擬器版本ZZZ的模擬器「。**或任何你認爲有用的東西。

這種問題已經浪費了幾個小時我的時間,我想同樣的事情發生到成千上萬的開發在世界各地仍這個異常坐在那裏 - 超過4年!