Visual Studio 2008を使ったアプリケーションの作成
では、早速アプリケーションを実装していきましょう。まず、Visual Studio 2008で新しいプロジェクトを作成します。メニューバーで[ファイル]-[新しいプロジェクト]を選択しましょう。[プロジェクトの種類]を[C#]-[Cloud Service]、[テンプレート]を[Web Cloud Service]にします。プロジェクト名/場所/ソリューション名を指定し、[ソリューションのディレクトリを作成]にチェックが入っていることを確認の上、[OK]をクリックしてください。サンプルではプロジェクト名を「CloudService1」としました。
続いて、各ファイルの編集に移ります。最初に編集するのはクラウドサービスの構成を定義する「ServiceDefintion.csdef」ファイルです。ローカルストレージを利用する際には、この定義ファイルに設定の追加が必要です。
ソリューションエクスプローラで、「CloudService1」プロジェクト以下にある「ServiceDefintion.csdef」ファイルを選択し、ダブルクリックしましょう。定義ファイルはXML形式で記述します。
デフォルト状態で基本的な構成は記述されています。ファイル内のWebRole要素が本サンプルのWebロールの構成を表します。このWebロール内でローカルストレージを利用するためWebRole要素の直下に定義を追記します。
次のように記述してください。
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="CloudService1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole"> <LocalStorage name="CloudService1Storage"/> <InputEndpoints> <!-- Must use port 80 for http and port 443 for https when running in the cloud --> <InputEndpoint name="HttpIn" protocol="http" port="80" /> </InputEndpoints> </WebRole> </ServiceDefinition>
追記したLocalStorage要素は、ローカルストレージを利用することを指定するための要素で、name
属性でストレージの名称を指定します。実際にWebロールからローカルストレージを利用する際にはここで指定した名称を使ってアクセスします。
さて、以上で「ServiceDefintion.csdef」の編集は終了しました。続いて「Default.apsx」を編集してアプリケーションのユーザーインターフェイスを定義しましょう。
以下にサンプルで配置するコントロールの一覧を示します。
コントロール名 | ID | 説明 |
ScriptManager | ScriptManager1 | AJAX利用のため |
UpdatePanel | UpdatePanel1 | Labelコントロールを自動更新するため |
Label | Label1 | ローカルストレージの内容を表示する |
TextBox | TextBox1 | テキストを入力する |
Button | Button1 | テキストをローカルストレージに書き込むボタン |
Button2 | テキストをログに書き込むボタン |
また、以下にVisual Studio 2008で編集中のフォームレイアウトのキャプチャも示します。配置の際に参考にしてください。
実際のコードはサンプルファイル内のソースを参照してください。ASP.NETに関する詳しい説明は本連載の趣旨からそれますので、ここでは控えたいと思います。Visual Studio 2008におけるASP.NET AJAX開発に関してさらに説明が必要な場合は、『ASP.NET AJAXの開発をさらにサポート「ASP.NET 3.5 SP1」』も参照してください。
続いてビハインドコード「Default.aspx.cs」を編集します。以下にコードの内容を示します。
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Microsoft.ServiceHosting.ServiceRuntime;
using System.IO; //usingディレクティブを追加
using System.Text;
namespace CloudService1_WebRole
{
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e) //書き込みボタンのイベント
{
string message = String.Format("{0} {1}{2}", DateTime.Now, TextBox1.Text, Environment.NewLine);//文字列に時間と改行を追加
Write(message); //書き込みの内容をWrite
メソッドに渡す
}
protected void Button2_Click(object sender, EventArgs e)
{
RoleManager.WriteToLog("Information", TextBox1.Text); //テキストの内容をログに書き込み
}
public void Write(string storageText) //ローカルストレージに文字列を記録するメソッド
{
ILocalResource resource = RoleManager.GetLocalResource("CloudService1Storage"); //ローカルストレージの使用を宣言
string path = Path.Combine(resource.RootPath, "storage.txt"); //パスの生成
File.AppendAllText(path, storageText, Encoding.UTF8); //引数の内容を書き込み
Read(path);//ローカルストレージのパスを指定しファイルの内容を読み込むメソッドに渡す
}
public void Read(string path) //ファイルの内容を読み込み表示するメソッド
{
StreamReader sReader = new StreamReader(path, Encoding.UTF8); //ローカルストレージ上のファイルから読み込み
string msg = string.Empty;
while (sReader.Peek() >= 0)//1行ずつ読み込む
{
string sTemp = sReader.ReadLine();
msg += sTemp + "<br/>";
}
sReader.Close();
Label1.Text = msg; //Labelコントロールに出力
}
}
}
コードに関する詳細はコメントを参照してください。Windows Azure特有のコードとしてRoleManager
クラスのWriteToLog
メソッドおよび同クラスのGetLocalResource
メソッド、そしてILocalResourceインターフェイスを実装したオブジェクトを利用しています。それぞれ以下に簡単な説明を示します。
名称 | 説明 |
RoleManager.WriteToLog | 値をログに書き込むメソッド |
RoleManager.GetLocalResource | サービス定義ファイル(ServiceDefintion.csdef)で定義されたローカルストレージの参照を返すメソッド。戻り値はILocalResourceインターフェイスのオブジェクト |
ILocalResource | ローカルストレージを表すインターフェイス。ILocalResourceインターフェイスを実装したオブジェクトのRootPath プロパティはパスを表す |
RoleManager.WriteToLog
メソッドの書式は次のとおりです。
RoleManager.WriteToLog([string eventLogName], [string message]);
eventLogNameにパラメータとして指定できるのはCritical、 Error、Warning、Information、Verboseの各イベントを表す文字列のみです。ただしCriticalイベントは緊急の警告メッセージであり、指定した場合はクラウド・サービス本体にもイベント発生が通知され、オペレータからの確認対象になる可能性があります。特に緊急性のないメッセージのパラメータにCriticalイベントを指定するべきではありません。
また、コードからも分かるように、ILocalResourceインターフェイスからRootPath
プロパティでパスを取得した後は、ローカルストレージ上のファイルは通常のファイルと同じようにFile
クラスなどで扱うことができます。
上述のコードについてさらに詳しい情報が必要な場合はMSDNのドキュメントを参照してください。
編集が済んだらサンプルをローカルで実行してみましょう。メニューバーから[デバッグ]-[デバッグ開始]を選択します。正しく実行できればブラウザは先ほどの例と同様の画面を表示するはずです。
テキストボックスに適当な文字列を入力し[ストレージ]ボタンをクリックすると、内容をローカルストレージ上のテキストファイルに追記すると同時に、画面に反映します。[ログ]ボタンをクリックした場合はテキストの内容をイベントログに記録します。
ブラウザからはイベントログを確認できないので、ローカルでアプリケーションを実行している仮想マシン(Development Fabric)のユーザーインターフェイスから確認しましょう。仮想マシンのユーザーインターフェイスを起動するには下のキャプチャでは左端にある、タスクトレイ内のギヤのような形状のアイコンを右クリックします。
表示されたタスクメニューから[Show Development Fabric UI]を選択してください。以下の画面のように仮想マシンのユーザーインターフェイスが立上がります。
左側ペインは現在実行しているアプリケーションの構成です。画面ではアプリケーション「CloudService1」でWebロールを実行していることを表しています。「0」という数字はインスタンス番号を表しており、この場合はインスタンスが一つだけ起動していることを示しています。エクスプローラ風のインターフェイスから「0」を選択すると右側ペインはイベントログを表示します。先ほどテキストボックスから入力したメッセージがイベントログに記録されているのが確認できるでしょうか(画面では上部の「テスト書き込みです。」という部分)。