ブロブを使用したサンプル
今回のサンプルはコード量が比較的多くなっていますので、主にREST APIを使用してWindows Azure Storageにアクセスする部分のコードを中心に説明します。その他の詳細は、サンプルファイルをダウンロードして確認してください。
サンプルのファイル構成
完成したサンプルのファイル構成は、次のようになります。
REST APIの使い方
サンプルの実装方法について説明する前に、REST APIの使い方について、大まかに理解しておきましょう。いくつかの重要なポイントの説明と、具体的なコード例を併記します。
リクエストURIとHTTPメソッド
開発用のローカル環境とクラウド上の実行環境では、コンテナやブロブなど各リソースへアクセスするためのリクエストURIの指定方法が異なります。
前回も扱いましたが、Windows Azure SDKには、Windows Azure Storageのシミュレーション環境であるDevelopment Storageというツールが含まれています。ローカル環境のストレージアクセスは、このDevelopment Storageに対して行なわれます。次のキャプチャを見ると分かるように、Development Storageにおける各ストレージのエンドポイントは固定値(例えば、ブロブのエンドポイントは「http://127.0.0.1:10000/」固定)となっており、ストレージアカウントが含まれていません。それでローカル環境の場合、各リソースへのリクエストURIを指定するに当たって、エンドポイントの後にストレージアカウントを含める仕様となっています。
例えば、コンテナ作成のためのリクエストURIは、ローカルかクラウド上かによって、次の表のように異なってきます。
環境 | エンドポイント | リクエストURI |
ローカル(Development Storage) | http://127.0.0.1:10000/ | http://127.0.0.1:10000/<ストレージアカウント>/<コンテナ名> |
クラウド上 | http://<ストレージアカウント>.blob.core.windows.net/ | http://<ストレージアカウント>.blob.core.windows.net/<コンテナ名> |
サンプルコードでは、BlobStorageUtilityクラスのContainerUriStringメソッドが、環境に応じて有効なリクエストURIを返す役割を担っています。
private static string ContainerUriString() { string uriString = String.Empty; if (blobStorageEndpoint.Equals("http://127.0.0.1:10000")) // ※1 uriString = blobStorageEndpoint + "/" + accountName + "/" + containerName; else uriString = blobStorageEndpoint + "/" + containerName; return uriString; }
静的メンバ変数であるblobStorageEndpointには、前回の最後に説明した、サービス構成ファイル(ServiceConfiguration.cscfg)の中で設定されているブロブのエンドポイントの値が格納されます。ここではこの値に基づいて、ローカルかクラウド環境かを判別しています(※1)。
コンテナやブロブに対する各操作に応じて、最終的なリクエストURIの形式が決まります。例えば、ブロブに対する操作であれば、リクエストURIの最後にブロブ名を指定します。
操作によっては、リクエストURIにクエリ文字列を指定する必要もあります。例えば、コンテナに含まれるブロブを列挙する場合(REST APIのList Blobs)は、クエリ文字列にcomp=listを指定します。
加えて、REST APIにおいては、リクエストでどのHTTPメソッドを使用するかという点も重要です。ブロブでは各操作に応じて、PUT/GET/DELETEのいずれかのHTTPメソッドを使用します。例えば、コンテナの作成にはPUTを、ブロブの取得にはGETといった具合です。
以下に、主なREST APIと、リクエストURI、後ほど説明するHTTPレスポンスのステータスコードについてまとめます(リクエストURIについては、コンテナ名より前の部分は省略)。
操作 | REST API | HTTPメソッド | リクエストURI | 成功時のHTTPレスポンスのステータスコード |
コンテナの作成 | Create Container | PUT | <コンテナ名> | 201(Created) |
ブロブの列挙 | List Blobs | GET | <コンテナ名>?comp=list | 200(OK) |
ブロブの作成 | Put Blob | PUT | <コンテナ名>/<ブロブ名> | 201(Created) |
ブロブの取得 | Get Blob | GET | <コンテナ名>/<ブロブ名> | 200(OK) |
ブロブの削除 | Delete Blob | DELETE | <コンテナ名>/<ブロブ名> | 200(OK) または 202(Accepted) |
ブロブのメタデータの取得 | Get Blob Metadata | GET/HEAD | <コンテナ名>/<ブロブ名>?comp=metadata | 200(OK) |
この記事では扱いませんが、テーブルやキューについても、REST APIで定められた同じような方法でアクセスすることができます。
サンプルから、どのREST APIを使用してブロブストレージにアクセスしているかを、図にまとめましたのでご覧ください。