[7]FileInfoEntityクラスの作成
表5で定義したテーブルのエンティティを表すクラスを作成します。FileInfoEntityという名前で、TableServiceEntityの派生クラスとして作成します。
using System;
using Microsoft.WindowsAzure.StorageClient;
namespace WebRole1
{
public class FileInfoEntity : TableServiceEntity
{
public string Title { get; set; }
public string OriginalFileName { get; set; }
public string BlobUri { get; set; }
public DateTime UploadedAt { get; set; }
public FileInfoEntity(string userName, string blobName)
: base(userName, blobName) // *1
{ }
public FileInfoEntity() : base() { }
}
}
TableServiceEntityクラスはテーブルのエンティティを表すクラスで、PartitionKey、RowKey、Timestampの3つのシステム予約プロパティへのサポートがなされています。このTableServiceEntityクラスを派生して、独自のプロパティを追加することにより、エンティティを定義することができます。ここでは、4つのプロパティを追加しています。
コンストラクタで受け取る2つのパラメータは、PartitionKey(userName)とRowKey(blobName)を表しており、これを基底クラスであるTableServiceEntityクラスのコンストラクタに渡しています(*1)。
[8]参照設定に、System.Data.Services.Clientを追加する
WebRole1の参照設定に、System.Data.Services.Clientを追加します。
これは、Windows Azureストレージ・クライアントライブラリがテーブルの操作のために、ADO.NETデータサービス(ADO.NET Data Services)を使用するためです。
ソリューションエクスプローラから、WebRole1プロジェクト内の参照設定フォルダを右クリックして、[参照の追加]を選択します。表示された「参照の追加」ダイアログ中の「.NET」タブ中より、System.Data.Services.Clientを選択し、[OK]ボタンをクリックします。
[9]Default.aspx.csにコードを記述する
最後に、Default.aspx.csに、Windows Azureストレージにアクセスするコードを記述します。
Usingディレクティブとインスタンス変数
次のリスト5の太字部分にあるように、3つのUsingディレクティブと2つのインスタンス変数を追加します。
using System;
using System.Linq;
using System.Web;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
namespace WebRole1
{
public partial class _Default : System.Web.UI.Page
{
private CloudBlobClient blobClient; // ブロブクライアント
private CloudTableClient tableClient; // テーブルクライアント
// 以下、省略
}
}
Page_Loadイベントハンドラ
Page_Loadメソッドにコードを記述します。
protected void Page_Load(object sender, EventArgs e)
{
// ストレージアカウントの取得 *1
string connectionString = RoleEnvironment.GetConfigurationSettingValue("DataConnectionString");
var storageAccount = CloudStorageAccount.Parse(connectionString);
// ブロブクライアントの作成 *2
blobClient = storageAccount.CreateCloudBlobClient();
// テーブルクライアントの作成 *3
tableClient = storageAccount.CreateCloudTableClient();
if (!IsPostBack)
{
// コンテナの作成(存在しなければ) *4
var blobContainer = blobClient.GetContainerReference("uploadedfiles");
blobContainer.CreateIfNotExist();
// コンテナの公開アクセスの許可レベルを、ブロブに設定する *5
var permissions = blobContainer.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
blobContainer.SetPermissions(permissions);
// テーブルの作成(存在しなければ) *6
tableClient.CreateTableIfNotExist("uploadedfileinfo");
Refresh();
}
}
まず、各ストレージのルートとなるストレージクライアントを取得します(*1)。次に、ブロブとテーブルの各ストレージを操作するクライアントを取得します(*2、*3)。
次に、「uploadedfiles」という名前でコンテナを作成します。既に存在していれば、何も処理は行われません(*4)。そして、作成したコンテナの公開アクセスの許可レベルを設定します。ここでは、登録されたブロブに誰でもアクセスできるように、ブロブレベル(BlobContainerPublicAccessType.Blob)に設定します(*5)。
コンテナの公開アクセスの許可レベルを表す、BlobContainerPublicAccessType列挙体には、次の表6にあるように、3つのメンバが定義されています。
| アクセスレベル | 説明 |
|---|---|
| Blob | ブロブレベル公開アクセス。匿名ユーザーは、コンテナ内のブロブデータのみ読むことができる |
| Container | コンテナレベル公開アクセス。匿名ユーザーは、コンテナとブロブデータを読むことができる |
| Off | 未公開アクセス。ストレージアカウント所有者のみ、コンテナにアクセス可能 |
次に、「uploadedfileinfo」という名前でテーブルを作成します。既に存在していれば、何も処理は行われません(*6)
なお、ページがロードされる度に、コンテナやテーブルの作成コードが毎回実行されるというのは、当然ですが設計上好ましくありません。これはあくまでサンプルとお考えください。
