13

Azure Storage Emulator を使用して BLOB ストレージを操作しようとしています。私はそれを機能させることができないようで、成功せずに一日を無駄にしました. これは開発者のストレージですが、403 禁止エラーが発生し続けます。ここの誰かが私を助けてくれることを願っています。

以前、この同じプログラムを Azure で正常に実行しました。しかし、実際にはまったく使用せずに 3 か月の試用期間が終了し、Azure の確認に戻ったので、ストレージ エミュレーターで実行する必要があります (接続文字列を開発ストレージに変更した後)。

私が行ったことを詳しく説明します。

まず、必要なものがすべてインストールされていることを確認させてください (と思います)。

Visual Studio 2012 Pro と Visual Studio 2012 Express for Web (無料) の両方を持っています。Web Platform インストーラーを使用して、Azure に必要な追加のものをインストールしました。プログラムの追加と削除を見ると、

  • Windows Azure Tools for Microsoft Visual Studio 2012 -v2.1
  • .NET 用 Windows Azure ライブラリ -v2.1
  • Windows Azure エミュレーター -v2.1
  • Windows Azure オーサリング ツール -v2.1

必要に応じて VS2012 でクラウド プロジェクトを作成できます。作成すると、エミュレーターで正常に起動します。したがって、私の問題はエミュレータのストレージのみにあるようです。

これが私がやったことです:

ステップ1。

新しい ASP.NET MVC4 プロジェクトを作成します。.NET フレームワーク 4.5 を使用しています。これにより、HomeController.cs と AccountController.cs を含む基本的なプロジェクト テンプレートが作成されます。

ステップ2。

NuGet を使用して「Windows Azure ストレージ」を取得します。これにより、プロジェクト参照に WindowsAzure.Storage.dll バージョン 2.0.6.1 が追加されると思います。それとは別に、私の参照には -Microsoft.WindowsAzure.Configuration v2.0.0.0 -Microsoft.WindowsAzure.Diagnostics v2.1.0.0 -Microsoft.WindowsAzure.ServiceRuntime v2.1.0.0 -Microsoft.WindowsAzure.StorageClient v1 も含まれていることがわかります.7.0.0

ステップ 3。

Web.config ファイルで、タグ内に次のタグを追加します

これは基本的に、エミュレーターを使用するときに誰もが使用することになっているアカウント名とキーです。

ステップ 4。

HomeController.cs でアクションを作成します。このアクションは、Azure BLOB ストレージにコンテナーを作成し、そこにファイルをアップロードすることになっています。これがコードです。ご覧のとおり、初心者の例で見られる標準的なコードです。


    public ActionResult AddBlobToBlobContainerStorageEmulator()
    {
        // Retrieve storage account from connection string
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]);

        // Create the blob client.
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve a reference to the previously created container. 
        CloudBlobContainer container = blobClient.GetContainerReference("myemulatortcont");

        // Create the container if it doesn't already exist.
        container.CreateIfNotExists();


        // Retrieve reference to a blob named "mytestblob".
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("myemulatortestblob.jpg");

        // Create or overwrite the "mytestblob" blob with contents from a local file.
        using (var fileStream = System.IO.File.OpenRead(@"E:\TUTORIALS\Windows Azure\Azure NOTES and stuff\table.jpg"))
        {
            blockBlob.UploadFromStream(fileStream);
        }

        return Content("Blob uploaded to container on storage emulator");
    }

ステップ 5。

コンピューティング エミュレーターが開始されていることを確認します: [スタート] > [すべてのプログラム] > [Windows Azure] > [エミュレーター] > [Windows Azure コンピューティング エミュレーター]

ステップ6。

それで全部です。私はクラウド プロジェクトなどを作成していないので、これを実行すると、プロジェクトのプロパティ (IIS Express とも呼ばれます) に従って「ローカル IIS Web サーバー」で実行されます。

ここで、[デバッグ] > [デバッグの開始] に移動すると、ブラウザー ウィンドウで期待どおりに localhost:57810 でサイトが起動します。

に移動すると

http://localhost:57810/Home/AddBlobToBlobContainerStorageEmulator

私のアクションメソッドを起動する必要があります。

代わりに私は見る

ここに画像の説明を入力

118行目が赤くなっているので、基本的にコンテナは作成できません。

誰かがここで何が悪いのか教えてもらえますか? 何らかの方法で開発ストレージ エミュレーターにアクセス許可を追加する必要がありますか? 禁止と書いてある理由がわかりません。

私のマシンに何か問題があるのではないか、それとも Azure 間に競合があるのではないかと考えていました。私のプロジェクトの dll のバージョンは、開発エミュレータに対して何らかの形で間違っていますか? それとも、v2.1 にバグがあるのでしょうか?

プロジェクトの作成方法を正確に説明しましたが、誰かがそれを実行してみたいと思っている場合は、すべてをアップロードしてもかまいません.

ご協力いただきありがとうございます。

4

5 に答える 5

19

率直に言って、元のコードが機能しなかったことに少し腹を立てています。結局のところ、Microsoft による MSDN の記事 ( https://azure.microsoft.com/en-us/documentation/articles/storage-use-emulator/ ) には、次を使用する必要があることが明確に記載されています。

アカウント名: devstoreaccount1 アカウント キー: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

では、なぜそれが機能しなかったのでしょうか。

基本的に、ストレージ エミュレーターには、クラウド ストレージ アカウントとは異なるエンドポイントがあります。たとえば、クラウド ストレージ アカウントの既定http://[youraccount].blob.core.windows.netの BLOB エンドポイントは ですが、ストレージ エミュレーターの BLOB エンドポイントは ですhttp://127.0.0.1:10000。接続文字列でストレージ エミュレーターのストレージ アカウント名とキーを指定するだけhttp://devstoreaccount1.blob.core.windows.net、ストレージ クライアント ライブラリはそれをクラウド ストレージ アカウントのように扱い、指定されたアカウント キーを使用して接続を試みます。クラウド内のキーはdevstoreaccount1提供したものではないため、403 エラーが発生します。

アカウント名とキーを使用してストレージ エミュレーターに接続する場合は、さまざまなエンドポイントなどの追加の詳細を提供する必要があります。したがって、接続文字列は次のようになります。

var connectionString = @"DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
    BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;
    TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;
    QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;";

接続文字列で指定したエンドポイントに注意してください。

var connectionString = "UseDevelopmentStorage=true";

上記のコードは、上で指定した大きな接続文字列の短い形式です。

これで疑問が解消されることを願っています。

于 2013-08-16T05:04:54.483 に答える
5

私はそれを考え出した!!または、より適切にここで答えを見つけました: https://stackoverflow.com/a/17500876/1400153

上に投稿したコードで、行を変更しました

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]);

var connectionString = "UseDevelopmentStorage=true";
var storageAccount = CloudStorageAccount.Parse(connectionString);

これは文字通り、私がコードに加えた唯一の変更です。

さらに、Windows タスクバーのエミュレーター アイコンを右クリックし、[ストレージ エミュレーター UI を表示] をクリックして、[リセット] ボタンをクリックしました。これが役に立ったかどうかはわかりませんが、次に行き詰まった人のために私が行った 2 つのことを記録しているだけです。

そして今、それは動作します...

率直に言って、元のコードが機能しなかったことに少し腹を立てています。結局のところ、Microsoft による MSDN の記事 ( http://msdn.microsoft.com/en-us/library/windowsazure/hh403989.aspx ) では、次を使用する必要があると明確に述べられています。

アカウント名: devstoreaccount1 アカウント キー: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

では、なぜそれが機能しなかったのでしょうか。その記事は 2012 年 7 月に更新されたので、正確に古くなっているわけではありません。非常に多くの時間が無駄になりました...しかし、少なくとも、ようやく何かが機能したことを知って、寝ることができます:)

于 2013-08-16T04:42:37.083 に答える
0

以前の投稿で述べたように、Azure ストレージ エミュレーターへの接続に "devstoreaccount1" アカウントを使用しないでください。代わりに、接続文字列として ""UseDevelopmentStorage=true"" のみを使用し、"devstoreaccount1" の代わりに devstorage DB を接続します。

完全な例: 構成内:

  add name ="ConnString" connectionString="UseDevelopmentStorage=true"
.....

コード内:

   string connStr = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;            
   CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connStr);

ここで、ストレージ エクスプローラーまたはサーバー エクスプローラー (VSTS) を使用して devStorage アカウントに接続し、DB 操作を監視します。

于 2014-01-17T15:43:38.673 に答える
0
container.SetPermissions(
                    new BlobContainerPermissions
                    {
                        PublicAccess =
                            BlobContainerPublicAccessType.Blob
                    });

接続を初期化するとき。ただし、最初に、Client for Storage を使用し、Client を使用してコンテナーの権限を変更します。

私のために働く;)

于 2016-03-30T19:00:29.540 に答える