(7)Webロールを実装する その1-コンテナとキューの作成
それでは、Webロールを実装していきましょう。
まず最初に、コンテナとキューを作成するコードを、次のリスト2のようにDefault.aspx.csに記述します。
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つのメンバが定義されています。
| アクセスレベル | 説明 |
| Blob | ブロブレベル公開アクセス。匿名ユーザーは、コンテナ内のブロブデータのみ読むことができる |
| Container | コンテナレベル公開アクセス。匿名ユーザーは、コンテナとブロブデータを読むことができる |
| Off | 未公開アクセス。ストレージアカウント所有者のみ、コンテナにアクセス可能 |
次に、「thumnails」という名前で、サムネイル画像格納用のコンテナを作成します(*7)。そして*6と同様に、コンテナの公開アクセスの許可レベルをブロブレベルに設定します(*8)。
最後に、「createthumnails」という名前で、キューを作成します(*9)。既にキューが存在していれば、何も処理は行われません。
なお、ページがロードされる度にコンテナやテーブルの作成コードが毎回実行されるというのは、当然ですが設計上好ましくありません。これはあくまでサンプルとお考えください。
(8)Webロールを実装する その2-ブロブのアップロードとメッセージの作成
Webロールの実装の次の手順として、ブロブのアップロードとメッセージの作成を行うコードを追加します。
[アップロード]ボタンのクリックイベントハンドラであるUploadButton_Clickメソッドを、次のリスト3のように追加します。
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のように追加します。
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ロールの実装が終了しました。
