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 
    } 

できるだけ早く文は、私は次の例外を取得していますexcecutedされている場合:

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

が、私はそれがコンテナの名前だと思ったが、私は何も表示されません。間違っている接続文字列は、ブロブのすべての詳細を含む良好な記憶域を作成するようです。私は迷っている。私はウェブを調査してみんながそれが命名問題だと言っているが、私はそれに間違って何かを見つけることができません。私が使用し

テストコンテナ名: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が使用されています。大文字と小文字の違いを確認してください。コンテナ名をすべて小文字に切り替えると、正しく動作します。詳細については


Naming and Referencing Containers, Blobs, and Metadataでコンテナ名の下で#3を参照してください。

3.コンテナ名のすべての文字は小文字でなければなりません。
+0

こんにちは、ありがとうございます。その文の最後に '.ToLower()'があり、文字列全体を小文字に変換します。どちらの場合も、私は何かを逃したと思っていたかもしれません。私は頭を上げて名前を静的な 'image'に変更しました。私は同じ例外がありました。 – hjavaher

+2

ポイント3は私のために働いた。ありがとう!! –

+0

私の場合、コンテナ名が短すぎます(少なくとも3文字でなければなりません) – Illidan

1

container.CreateIfNotExist()が現在container.CreateIfNotExists()になっているため、問題の再現を試みましたが、クライアントライブラリの古いバージョンを使用しているようです。最新のクライアントバージョン(2.1)のアップグレードを検討しましたか?

+0

こんにちは、実際に問題を見つけましたが、これは問題ではありませんでした。しかし、私は新しい(実際には新しい)パッケージがあり、それをアップグレードしたことに気付かなかった。 – hjavaher

+4

私の場合は、エミュレータが古くなっていたという問題でした。最新のエミュレータ(2.7 SDK全体に移動する必要はありませんでした)をインストールすると、この問題が発生したマシンの問題が修正されました。 –

0

httpstatusメッセージが表示されない場合は、 私の場合は、エラーが発生しました。 要求されたURIがサーバー上のリソースを表していないためです。私が見てきた

ので、私は私のBlobContainerNameは、右コンテナ(またはしない存在する)が含まれていないことを見てきました

CloudBlobContainer container = > blobClient.GetContainerReference(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の答えに拡大するためにコンテナを追加するblobcontainernameは、私はに任意の文字列を変換するためのソリューションを実装しました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

これはうまくいくが、私は一般的に、このような解決策を回避しようとする(例えば、同じ名前に解決される2つの異なる名前など) –

5

ストレージライブラリとストレージエミュレータのバージョンが「同期していない」ことを確認してください。ライブラリを更新しましたが、エミュレータを最新バージョンにアップデートしていないため、この正確な状況になっています。

+0

ありがとう! NuGet経由でWindowsAzure.Storageパッケージをアップグレードし、このエラーが発生しました。 Azure Storage Simulatorの最新バージョンをアンインストールしてダウンロードしました。これでエラーが解消され、すべて正常に動作しました。 –

2

コンテナ名は常に小文字である必要がありますが、実験的に見えます。内部的に暗黙の変換が必要です。これにより、元のBLOBを小文字で作成しますが、createifnotexists(async)で比較するときは作成しません。しかし、それを再作成するには、再度それを減らします。その結果、矛盾が生じます。これは最高の推測です。

2

私はこの問題を直して修正しました。

私のコンテナ名は問題ありませんでしたが、誤って接続文字列のAccountNameパラメータが大文字になっていました。これはに導いた私の400

4

あなたはだけ更新WindowsAzure.Storage nugetパッケージを持っており、あなたのアプリがHTTPエラー400不正な要求でクラッシュ開始した場合:それが起こった私の場合は

ときI 8.2.1に更新され、私のローカルエミュレータはバージョン5.1となりました。 "Azureストレージエミュレータ" の

  1. ゴーマイクロソフトのAzureへのSDKのページhere.
  2. 検索し、最新のストレージエミュレーターをダウンロード:

    私のソリューションはこれです。通常、「コマンドラインツール」セクションの左側のページの中央に

  3. は、あなたが行ってもいいです最新のエミュレータ
  4. をインストールします。

Storage Emulator 5.2をダウンロードして5.1からアップグレードすると、エラーが停止しました。 このようなエラーはすでに数回私に起こりました。

My humble request if anybody from Microsoft Azure Storage Emulator team reads this - アズールでVVV **現在WindowsAzure.Storageライブラリを使用するためにあなたはXYZがインストールAzureストレージエミュレーターバージョンを持っている」- 。開発モードのチェックを追加し、ようなメッセージで意味のある例外をスローしてくださいエミュレータでは、このリンクからエミュレータのバージョンZZZをインストールする必要があります。 "

この種の問題は、数時間の時間を無駄にしています。世界中の何千という開発者にも同様のことが起こりましたが、この例外は4年以上続いています。

関連する問題