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}
PDATE:コンテナ名をimage
に変更しましたが、同じ例外が発生します。また、開発接続文字列は次のとおりです。<add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />
実際に問題を見つけました。
私の問題は、BLOBストレージエミュレーターが起動しないことでした(他のエミュレーターが起動し、BLOBを見逃しました)。問題は、ポート10000(デフォルトのblobエミュレーターポート)が別のソフトウェアによって既に使用されていたということです。 Netstat
cmdツールを使用して、どのソフトウェアであるかを確認し、それを強制終了し、現在は魅力的な動作をしています!!!みんな、ありがとう!!
調査でわかったように、問題は名前です。
テストコンテナの名前はimageads-57905553-8585-4d7c-8270-be9e611eda81
、しかしあなたのコードではImageAds-57905553-8585-4d7c-8270-be9e611eda81
。大文字の違いに注意してください。コンテナ名をすべて小文字に切り替えると、正しく機能します。
詳細については、「 コンテナ、BLOB、およびメタデータの命名と参照 :のコンテナ名」の#3を参照してください。
3.コンテナ名のすべての文字は小文字でなければなりません。
@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());
ストレージライブラリとストレージエミュレータのバージョンが「同期していない」ことを確認します。ライブラリを更新しましたが、エミュレーターを最新バージョンに更新せず、この正確な状況になりました。
ちょうど更新された場合WindowsAzure.Storagenugetパッケージとアプリhttpエラー400 bad requestでクラッシュを開始しました:
私の場合、8.2.1にアップデートし、ローカルエミュレーターがバージョン5.1であったときに発生しました。
私の解決策はこれです:
Storage Emulator 5.2をダウンロードして5.1からアップグレードすると、エラーが停止しました。このようなエラーはすでに何度か発生しました。
Microsoft Azure Storage Emulatorチームの誰かがこれを読んだ場合の謙虚なリクエスト -開発モードのチェックを追加し、次のようなメッセージで意味のある例外をスローしてください- Azure Storage EmulatorバージョンXYZがインストールされています。AzureEmulatorで現在のWindowsAzure.Storageライブラリ** VVVを使用するには、このリンクからエミュレータのバージョンZZZをインストールする必要があります。**などあなたは便利だと思う。
この種の問題は私の時間の数時間を無駄にしました、そして、同じことが世界中の何千人もの開発者に起こったと思います、そして、まだこの例外はそこにあります- 4年以上の間!
私の名前は愚かな名前の問題でした!どうやら許可されていないは名前に大文字を使用しています。
これを変更しました。
CloudBlobContainer container = blobClient.GetContainerReference("MyContainer");
container.CreateIfNotExists();
To
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
この問題が発生したので修正しました。
コンテナ名は問題ありませんでしたが、接続文字列のAccountNameパラメータが誤って大文字になっています。これは私の400につながりました。
実験から、コンテナ名も常に小文字である必要があるように見えます。内部的に暗黙的な変換が必要です。これにより、元のblobが小文字で作成されますが、createifnotexists(async)で比較すると変換されません。しかし、それを再作成しようとすると、再び小文字が付けられ、競合が発生します。これは最良の推測です。
私のコードではなく、パッケージの更新後にこのエラーが発生しました。私の問題は、数年前にAzure Storageの使用を開始してから、接続文字列の形式とコンテンツが変更されたことです。 Azureポータル内のアクセスキーオプションから接続文字列を適切に更新してください。
私の場合:接続文字列でこれが欠落していました:EndpointSuffix = core.windows.net
この問題の簡単な解決策は、コンテナを常に小文字にすることです。コンテナ名をすべて小文字に変更すると解決した同じ問題がありました。
問題を再現しようとしましたが、container.CreateIfNotExist()
がcontainer.CreateIfNotExists()
になったため、古いバージョンのクライアントライブラリを使用しているようです。最新のクライアントバージョン(2.1)のアップグレードを検討しましたか?
例外としてhttpstatusmessageを表示する必要があります。私の場合、エラーは、要求されたURIがサーバー上のリソースを表していないためでした。
私のBlobContainerName
に正しいコンテナが含まれていない(または存在しない)ことがわかりました
CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);
私が見た他のケースは、コンテナの間違った名前です。 「mycontainer1」や「mycontainer2」などの名前でなければならないblobcontainernameなど
ここにコンテナを追加するコード
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 "";
}