SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

正式リリースされたWindows Azureの力

キューを使用したWindows Azureストレージプログラミング

正式リリースされたWindows Azureの力(3)

(7)Webロールを実装する その1-コンテナとキューの作成

 それでは、Webロールを実装していきましょう。

 まず最初に、コンテナとキューを作成するコードを、次のリスト2のようにDefault.aspx.csに記述します。

[リスト2]コンテナとキューの作成(Default.aspx)
using System;
using System.Linq;
using System.Text;

// 追加したusingディレクティブ  *1
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

namespace WebRole1
{
    public partial class _Default : System.Web.UI.Page
    {
        // インスタンス変数     *2
        private CloudBlobContainer imagesContainer;     // オリジナル画像用コンテナ
        private CloudBlobContainer thumnailsContainer;  // サムネイル画像用コンテナ
        private CloudQueue queue;   // キュー
        
        protected void Page_Load(object sender, EventArgs e)
        {
            // ストレージアカウントの取得   *3
            string connectionString = RoleEnvironment.GetConfigurationSettingValue("DataConnectionString");
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

            // ブロブとキュークライアントの作成     *4
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

            // オリジナル画像用コンテナの作成(存在しなければ)     *5
            imagesContainer = blobClient.GetContainerReference("images");
            imagesContainer.CreateIfNotExist();

            // コンテナの公開アクセスの許可レベルを、コンテナに設定     *6
            BlobContainerPermissions permissions = imagesContainer.GetPermissions();
            permissions.PublicAccess = BlobContainerPublicAccessType.Container;
            imagesContainer.SetPermissions(permissions);

            // サムネイル画像用コンテナの作成(存在しなければ)     *7
            thumnailsContainer = blobClient.GetContainerReference("thumnails");
            thumnailsContainer.CreateIfNotExist();

            // コンテナの公開アクセスの許可レベルを、コンテナに設定     *8
            permissions = thumnailsContainer.GetPermissions();
            permissions.PublicAccess = BlobContainerPublicAccessType.Container;
            thumnailsContainer.SetPermissions(permissions);

            // キューの作成(存在しなければ)       *9
            queue = queueClient.GetQueueReference("createthumnails");
            queue.CreateIfNotExist();
        }

        // … 以下、省略 …

    }
}

 まず、使用するWindows Azureマネージライブラリの3つのusingディレクティブと、コンテナやキューを管理する2つのインスタンス変数を追加します(*1*2)。

 次に、各ストレージのルートとなるストレージクライアントを取得します(*3)。そして、ブロブとキューの各ストレージを操作するクライアントを取得します(*4)。

 次に、「images」という名前で、オリジナル画像格納用のコンテナを作成します(*5)。既にコンテナが存在していれば、何も処理は行われません。そして、コンテナの公開アクセスの許可レベルを設定します。ここでは、登録されたブロブに誰でもアクセスできるように、許可レベルをブロブレベル(BlobContainerPublicAccessType.Blob)に設定します(*6)。

 前回も説明したとおり、コンテナの公開アクセスの許可レベルを表す、BlobContainerPublicAccessType列挙体には、次の表3にあるように、3つのメンバが定義されています。

表3:コンテナの公開アクセスの許可レベル(BlobContainerPublicAccessType列挙体)
アクセスレベル 説明
Blob ブロブレベル公開アクセス。匿名ユーザーは、コンテナ内のブロブデータのみ読むことができる
Container コンテナレベル公開アクセス。匿名ユーザーは、コンテナとブロブデータを読むことができる
Off 未公開アクセス。ストレージアカウント所有者のみ、コンテナにアクセス可能

 次に、「thumnails」という名前で、サムネイル画像格納用のコンテナを作成します(*7)。そして*6と同様に、コンテナの公開アクセスの許可レベルをブロブレベルに設定します(*8)。

 最後に、「createthumnails」という名前で、キューを作成します(*9)。既にキューが存在していれば、何も処理は行われません。

 なお、ページがロードされる度にコンテナやテーブルの作成コードが毎回実行されるというのは、当然ですが設計上好ましくありません。これはあくまでサンプルとお考えください。

(8)Webロールを実装する その2-ブロブのアップロードとメッセージの作成

 Webロールの実装の次の手順として、ブロブのアップロードとメッセージの作成を行うコードを追加します。

 [アップロード]ボタンのクリックイベントハンドラであるUploadButton_Clickメソッドを、次のリスト3のように追加します。

[リスト3]ブロブのアップロードとメッセージの作成(Default.aspx)
protected void UploadButton_Click(object sender, EventArgs e)
{
    if (!FileUpload1.HasFile)
        return;

    // ブロブ名の作成   *1
    // 最後尾の数字は、サムネイル作成時のオプション指定を意味
    string blobName = Guid.NewGuid().ToString() + "_" + RadioButtonList1.SelectedValue;
    
    // オリジナル画像のアップロード     *2
    CloudBlob blob = imagesContainer.GetBlobReference(blobName);
    blob.UploadFromStream(FileUpload1.FileContent);

    // メッセージの作成     *3
    CloudQueueMessage message = new CloudQueueMessage(Encoding.UTF8.GetBytes(blobName));
    queue.AddMessage(message);
}

 まず、ブロブ名を作成します(*1)。サンプルでは、ブロブ名をメッセージの内容としても使用します。そして、メッセージにはサムネイル作成時の選択されたオプション情報も含めたいので、ブロブ名を「GUID(グローバル一意識別子)_オプション番号」の形式で作成します。

 次に、オリジナル画像を「images」コンテナにアップロードします(*2)。

 最後に、メッセージを作成しキューに追加します(*3)。メッセージ内容は、UTF8でエンコードされていなければなりません。*1で指定した形式で作成することにより、Workerロール内でキューからメッセージを受け取った時に、オリジナル画像のブロブのURIとサムネイル作成時の選択されたオプション情報を知ることができ、サムネイル画像を作成できます。

(9)Webロールを実装する その3-サムネイル画像の一覧表示

 Webロール実装の最後として、Workerロールで作成されたサムネイル画像をブロブから取得し、画面上に一覧表示するコードを追加します。

 [サムネイル表示]ボタンのクリックイベントハンドラであるRefreshButton_Clickメソッドを、次のリスト4のように追加します。

[リスト4]ブロブのアップロードとメッセージの作成(Default.aspx)
protected void RefreshButton_Click(object sender, EventArgs e)
{
    // サムネイル画像のURIを取得するLINQクエリを作成し、クエリ結果をバインドする    *1
    DataList1.DataSource = from o in thumnailsContainer.ListBlobs()
                           select new { Url = o.Uri };
    DataList1.DataBind();
}

 「thumnails」コンテナに登録されている全てのサムネイル画像のブロブのリストを取得するLINQクエリを作成し、そのクエリ結果をDataListデータコントロールにバインドします(*1)。これで、Workerロールで作成されたサムネイル画像を一覧表示できます。

 なお、今回のサンプルでは扱いませんでしたが、[サムネイル表示]ボタンクリック時のユーザー任意のタイミングでサムネイル画像を取得する代わりに、ASP.NET AJAX ExtensionsのUpdatePanelコントロールやTimerコントロールなどを使用して、AJAXを利用した表示の自動更新の仕組みを作成してみるのも面白いでしょう。

 これで、Webロールの実装が終了しました。

次のページ

この記事は参考になりましたか?

正式リリースされたWindows Azureの力連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 広瀬 嘉久(株式会社ジェイテックジャパン)(ヒロセ ヨシヒサ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5222 2010/06/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー