Azure Web Sites

クラウドからの授業

James Chambers

コード サンプルのダウンロード

Web 開発者になるには良い時代になりました。プロジェクトの作成から一般公開されるエンドポイントへの配置に至るまでの一連の作業は非常に骨の折れる仕事で、これまでの Web 開発者はこうした作業に気力をくじかれ、圧倒されたものでした。しかし、今ではこれもコンピューティング分野における "解決済みの" 課題になっています。

リソースがほとんどなくても、無償の IDE やソース管理ツールをダウンロードできます。プロジェクトに着手して、リッチなインフラストラクチャに配置でき、ハードウェアにアクセスしなくても、ハードウェアに関する知識がなくても、自動的にメンテナンスが行われます。そして、コストをかけずにプロジェクトのホストを開始できます。

操作する構成要素はこれまでにないほど包括的になっています。それは、PHP でも、Java でも、Microsoft .NET Framework でも同じです。プロジェクト管理、ネットワーク、ストレージ、配置手順、スケーラビリティなどを気にすることなく、ユーザー エクスペリエンス (UX) に専念できるようになります。

今回取り上げる「FrontClass」アプリケーションは、数十年前なら、動作させるまでに少なくとも数週間必要でした。アプリケーションをすべての環境で動作させることは難しく、配置作業はまさに悪夢のようだったに違いありません。おそらく、スケーラビリティの問題はその期間内に解決できなかったでしょう。現在であれば、このプロジェクトを数時間でビルドして配置し、拡張可能な状態にできます。ダウンロード可能な付属のソリューションには、自身の Microsoft Azure アカウントを変更することなく配置でき、実際に機能する完全なソース コードを含めています。

私が FrontClass プロジェクトに着手したのは、地元の中学校で 10 ~ 14 歳の子どもたちにプログラミングを教えるボランティアをしているときでした。ペースを管理する意味で生徒たちとコンテンツを共有しますが、必要に応じて生徒たちが前の単元に戻れるようにしました。このアプリケーションには、講師が授業を運営するのに役立つ機能領域があります。それは、授業の構成、教室での指導、生徒の参加の 3 つです。ここからは、これらの各領域を詳しく説明していきますが、当然、一部重複があります。

プロジェクトの基礎

アプリケーションのビルドには Visual Studio 2013 Update 2 を使用します。ソリューションと ASP.NET MVC テンプレートの作成時には ASP.NET Web アプリケーションも使用します。テンプレートから作成されるプロジェクトのスタイルの設定や一部の UI 機能には、広く利用されている Bootstrap フロントエンド フレームワークを使用します。

リアルタイム機能の実現には、SignalR パッケージを追加して、Visual Studio でよく知られるようになったツーリングを使用します。また、クライアント ページでは必要不可欠な jQuery ライブラリも使用します。開発環境では既定で LocalDb を使用するように Entity Framework (EF) を構成しますが、Azure Web Sites に配置する際は、データ ストアとして Azure SQL データベースを使用します。ただし、プロジェクト全体は、配置ターゲットを構成できる Azure ポータル (portal.azure.com、英語) から開始します。

Azure Web Sites を作成する: ポータルの左下隅にある [New] (新規) をクリックし、Website + SQL (Web サイト + SQL) テンプレートを選択します (図 1 参照)。Azure によって、リンクされたリソースのセットが作成されます。このグループに適した名前を選択して、アプリケーションに名前を付けます。サイト用データベースの作成では、新しいデータベースを作成することも、アカウントで使用している既存のデータベースを選択することもできます。ネットワーク トラフィックの時間を短縮するため、データベースと Web サイトは同じゾーン内に配置することをお勧めします。

Create a New Azure Web Site with Linked Database図 1 リンクしたデータベースを利用する新しい Azure Web Sites の作成

今回の例では、リソース グループを ELearning、データベースを FrontClass_DB、サイトを FrontClass としています。サイト名には一意名を選択する必要があります。プロビジョニングが完了したら、frontclass.azurewebsites.net というホスト名になります。これで、配置ターゲットでサイトをホストする準備が整います。

魔法のように外観が変化するにもかかわらず、驚くような作業はそれほどありません。DNS エントリを作成し、ホスト名と IP アドレスをマッピングして、既定のドキュメントや接続文字列といったいくつかの構成オプションを作成していますが、これらは基本的にサイトを動作させるためにバックグラウンドの IIS で行う作業です。つまり、先ほど述べたとおり、これは魔法ではありませんが、きわめて簡単な作業です。また、ソース管理や配置スクリプトなど、作業を始める際に役立つインフラストラクチャ型のツールもいくつか用意されています。

ソリューションを作成する: 次に、Visual Studio に移り、ソリューションの基盤として前述のように ASP.NET Web アプリケーションを選択します。(ASP.NET MVC テンプレートを使用して) 作成するプロジェクトの種類を選ぶ際は、関連するリソースを Azure 上に作成するためのオプションも利用できます。今回は既にポータルを使ってサイトとデータベースを作成してあるので、チェック ボックスをオフにしてサイトの作成に進みます。

コースのモジュールの構成

このプロジェクトの目的から、管理するデータ モデルはかなり単純になります。EF6 を使用して、Code First でモデルを作成します。これにより、後でデータ移行を利用して変更を加えることができます。最終的には、コース、モジュール、および単元という構造を表す、クラスのシンプルなセットを作成します (図 2 参照)。

The Basic Application Data Model図 2 アプリケーションの基本データ モデル

必要に応じてすべての要素を関連付けるには、やや形式的な作業が必要です。具体的には、使用するデータベースを 1 つにし、移行が発生するタイミングを制御できるようにして、アプリケーションの起動時に未処理のすべての移行を自動的に実行するようにします。

これにより、各移行での変更を明示的に制御できます。また、開発者が介入しないアプリケーション自体での更新も実現できます。さらに、Configuration クラスの Seed オーバーライドを利用して、管理者ロールと講師ロール (最初かつ唯一の管理ユーザー) が、データベースにデータを事前設定する手段も用意します。

接続文字列を指定する: Entity Framework では、1 つの接続文字列内の異なるコンテキストと移行に同じデータベースを使用できます。名前を渡して基本クラスのコンストラクターを呼び出すと、フレームワークはまずアプリケーション構成または Web 構成を参照し、同じ名前で定義された接続文字列の有無を確認します。同じ名前で定義された接続文字列がある場合は、その接続文字列を使用して接続を確立します。

各コンテキストの移行履歴は、更新プロセスの一環として名前空間をログ記録することで保持されます。これにより、各移行を相互に関係しないで個別に実行できます。これをセットアップするために、次のように既定のコンストラクターをコンテキスト クラスに追加します。

public FrontClassContext()
  : base("DefaultConnection") { }

プロジェクト テンプレートの一部として作成し、IdentityModels.cs ファイルに格納したコンテキストを見ると、同じような既定のコンストラクターが存在することがわかります。IdentityDbContext 基本クラスの性質を反映するためにわずかに変更を加えていますが、Web.Config ファイルの DefaultConnection 接続文字列を使用する点は変わりません。

移行を有効にする: Visual Studio の Package Manager Console から次のコマンドを実行して作成したエンティティの構成クラスを生成します。

Enable-Migrations -ContextTypeName FrontClass.DAL.FrontClassContext

このコマンドは、コースに関連するエンティティの移行を対象としています。同じ処理を ApplicationDbContext でも実行します。クラス名を置き換えてこのコマンドをもう一度実行することもできますが、アカウントを保存するコンテキストで構成、移行、およびシードを有効にする際に、以前スキャフォールディングした構成クラスを上書きすることは好ましくありません。代わりに、MigrationsDirectory パラメーターをコマンドに渡し、移行用の代替ディレクトリを次のように指定します。

 

Enable-Migrations -ContextTypeName FrontClass.Models.ApplicationDbContext -MigrationsDirectory:"Models\AccountMigrations"

最初の移行を追加する: 次の手順では、Entity Framework が実行するクラスを単純にスキャフォールディングします。次のコマンドを、移行の作成対象とする DbContext ごとに 1 回ずつ、計 2 回使用します。

Add-Migration Initial-Model -ConfigurationTypeName FrontClass.Migrations.Configuration
Add-Migration Initial-Model -ConfigurationTypeName FrontClass.Models.AccountMigrations.Configuration

繰り返しになりますが、複数のコンテキストを扱う場合は、ConfigurationTypeName パラメーターを指定する必要があるため、作業が少し複雑になります。それ以外の場合は、単純な作業です。

データベースの初期化方法を設定する: 移行を自動的に実行するように EF を構成するには、データベースにアクセスする前に、使用する方法を EF に指示する必要があります。これを行わないと、モデルがデータベースと同期されていないことを示す例外メッセージが実行時に表示されます。クラスに変更を加えるたびに、データ モデルの計算済みハッシュ値が変更の影響を受けます。このことはデータベースで追跡されます。

今回の Global.asax には、MigrateDatabaseToLatestVersion 初期化子を使用するために、次に示す 2 行のコードを追加しています。

Database.SetInitializer<ApplicationDbContext>(
  new MigrateDatabaseToLatestVersion
    <ApplicationDbContext, 
     FrontClass.Models.AccountMigrations.Configuration>());
Database.SetInitializer<FrontClassContext>(
  new MigrateDatabaseToLatestVersion
    <FrontClassContext, FrontClass.Migrations.Configuration>());

このコードでは、構成するコンテキストを受け取る SetInitializer ジェネリック メソッドを呼び出しています。今回の例では、複数の構成クラスに同じ名前を付けているため、クラス名を完全な名前空間で修飾して使用しています。

テーブルにシードする: 初回実行時に、ユーザーが "ログインを行うだけ" でアプリケーションの使用を開始できる操作性を提供したいと考えています。そのためには、一般的なブログ アプリケーションで使用されているような、一度だけ実行するコントローラーを作成してもかまいません。もう 1 つの選択肢として、Configuration クラスで Seed メソッドを使用する方法があります。Seed メソッドは、(テーブルを操作できる) 適切なコンテキストのインスタンスに渡されます。

ASP.NET Identity 2.0 では、EF に対応する豊富なクラスも提供されます。これにより、図 3 のように、条件に応じてロールとユーザーをデータベースに挿入できます。

図 3 最初のロールと管理者ユーザーのシード

if (!context.Roles.Any(r => r.Name == 
  FrontClass.MvcApplication.AdministratorRoleName))
{
  var roleStore = new RoleStore<IdentityRole>(context);
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  var identityRole = new IdentityRole 
    {Name = FrontClass.MvcApplication.AdministratorRoleName};
  roleManager.Create(identityRole);
}
var instructorName = "instructor@contonso.com";
if (!context.Users.Any(u => u.UserName == instructorName))
{
  var userStore = new UserStore<ApplicationUser>(context);
  var userManager = new UserManager<ApplicationUser>(userStore);
  var applicationUser = 
    new ApplicationUser { UserName = instructorName };
  userManager.Create(applicationUser, "init_2014");
  userManager.AddToRole(applicationUser.Id, 
    FrontClass.MvcApplication.AdministratorRoleName);
}

モジュールに関連するテーブルにもいくつかのサンプル データをシードしています (付属のコード ダウンロードで確認できます)。アプリケーションが起動すると、"instructor@contonso.com" というユーザー名と "init_2014" というパスワードを使用してアプリケーションにログインできます。この時点では、データ構造が準備されていて、アプリケーションは複数のコンテキストで同じデータベースを使用するように構成されており、ログイン可能な管理者ユーザー (講師アカウント) が存在しています。

基本的な編集機能: 実際のコース構成で最後に必要な作業は、作成、読み取り、更新、削除 (CRUD) 機能を提供することです。プロジェクトのルートに administration (管理) という新しい領域を作成し、組み込みのスキャフォールディング ツールを使用して UI をビルドします。最後に、Index アクションが組み込まれた管理用コントローラーと、コースの管理画面、モジュール、および単元へのリンクが表示されたビューを作成します。

コースの指導

講師は管理ビューでコースを選択できます。このビューは、その後モジュールを選択する際にも使用します。各単元は、管理ビューに続くモジュール ページに表示されます (図 4 参照)。どの単元でも仮想の教室にいる生徒に送信でき、講師はコンテンツをプレビューすることができます。

Conduct the Class
図 4 授業の運営

会議セッションを使用する生徒もいれば、講師と同じ教室にいる生徒もいて、世界各地に散らばっていてもかまいません。このアプリケーションを使用するコンテキストは、数十人または数百人にも及ぶ生徒が参加するライブのオンライン仮想教室になることもあります。どのような状況でアプリケーションを使用するとしても、アプリケーションをスケール変換できるようにします。そこで、授業のペイロードを生徒が実際に取得する方法を考える必要があります。

単元は、1 つのコース モジュール内で、プレーン テキストや HTML として作成します。各単元の長さに決まりはありません。SignalR は、(WebSockets、Server-Sent Events、ロング ポーリング、または固定フレームとの) トランスポートのネゴシエーション メカニズムの処理において、優れた効果を発揮します。また、SignalR を使用すると、メッセージのシリアル化について心配する必要もなくなります。

結局のところ、スケーラビリティを確保するには、メッセージのサイズを小さく抑えることが必要です。メッセージのサイズを小さく抑えれば、サーバー リソースの需要が最小限に抑えられ、シリアル化のコストが削減され、クライアントのブラウザでインフラストラクチャの一部 (キャッシュ機能など) を利用できるようになり、SignalR の 設計と同じ方法で (シグナル化に) 使用できるようになります。

メッセージのサイズを小さくする最善の方法は、授業の単元全体ではなく、"New content is available here" (新しいコンテンツを入手できます) というメッセージをクライアントに送信することです。JSON で記述し、シリアル化した次のメッセージをクライアントが受け取るとします。

{"H":"ModuleStepHub", "M":"updateStep",
  "A":["\n<h1>Welcome to the course!</h1><p>trimmed for brevity...</p>\n"]}

このメッセージは、クライアント側の updateStep メソッドの引数のペイロードとして、HTML を渡しています。"trimmed for brevity" (簡潔にするため省略しています) というテキスト部分には注意が必要です。講師がどのように単元を作成するかによって、この部分の内容が大幅に増大する可能性があります。現在は単なるテキストを設定しています。しかし、数ページに及ぶコンテンツや画像を直接送信しようとすると、メッセージのサイズがどれだけ増大するかは察しがつくでしょう。テキストや画像は JSON にシリアル化され、シグナル化パイプライン リソースを使用して各クライアントに送信されます。今回は、このような処理の代わりに、シグナル (特にブラウザーで読み込まれる新しいコンテンツ ID) を送信します。メッセージのサイズは極端に小さくなり、次のようになります。

{"H":"ModuleStepHub","M":"notifyStepAvailable","A":[7]}

メッセージを使って達成しようとしている目標が分かったところで、アプリケーションにこの機能を構築します。

ハブを作成する: プロジェクトに Hub フォルダーを追加したら、[新しい項目の追加] ダイアログ ボックスで SignalR Hub クラス (v2) を追加します。ハブは、SignalR のサーバー側の部分で、メッセージの発行やクライアントの呼び出しを処理するために作成します。この方法では、Visual Studio が依存関係を読み取り、ハブで 1 つのサンプル メソッドを含むクラスをスキャフォールディングします。今回は、サンプル メソッドを削除して、次のコードを使ってメッセージを送信する新しいメソッドを作成します。

public void MakeStepAvailable(int stepId)
{
  Clients.Others.notifyStepAvailable(stepId);
}

このコードは、コースの講師が、単元を生徒に送信するなんらかのアクションを呼び出すことを前提としています。Clients オブジェクトの Others 動的プロパティを使用することで、接続している他のすべてのクライアントに単元 ID を送信するように SignalR に指示します。SignalR には、こうしたフィルター処理オプションがいくつか用意されているため、特定のユーザー、ユーザーのグループ、または接続している他のクライアントを更新できます。また、ハブによって講師が新しいモジュールを開始することもできます。生徒は、講師から提供される単元の一覧を受け取ります。

SignalR ハブをマッピングする: ハブで作成した機能を公開するには、アプリケーションの起動時に SignalR に合図を出す必要があります。MapSignalR を呼び出すと、JavaScript プロキシと通信する既定のエンドポイントが設定されます。この処理をクライアントに組み込むと、クライアントからサーバー側のメソッド (およびサーバーからクライアント側のメソッド) を呼び出せるようになります。プロジェクトのルート フォルダーに OWIN Startup クラスがあります。このクラスは、Configuration メソッドで関連付けを処理するための呼び出しを行います。変更後のコードは次のようになります。

public void Configuration(IAppBuilder app)
{
  ConfigureAuth(app);
  app.MapSignalR();
}

ここで重要なのは、最初に ConfigureAuth を呼び出すことです。OWIN パイプラインはミドルウェアを使用して、ミドルウェアが登録された順序でメッセージをプッシュします。今回の例では、ハブが呼び出しを受け取る前に認証および承認を処理します。

共有を有効にする: 講師がコンテンツを共有できるように、InstructController というもう 1 つのコントローラーをアプリケーションに追加します。このコントローラーには Index アクションのみを含めます。Authorize 属性でクラスを修飾しているため、その教室を制御できるのは管理者だけです。Index アクションは、モジュール ID をパラメーターとして受け取ります (このルートは、App_Startup\RouteConfig.cs クラスで構成しています)。メソッドはデータベースのモジュールを検索し、クエリに含まれる単元のコレクションと共にレコードをビューに返します。

対応するビュー (Views\Instruct\Index.cshtml にあります) では、単元ごとに単純な [Share] ボタンを作成します。単元の ID は、data-id 属性を使用して格納します。前の手順で公開した SignalR ライブラリとハブのプロキシを追加した後、プロキシを起動して講師によるクリック イベントを処理するための少量の JavaScript コードを記述します (図 5 参照)。

図 5 プロキシを起動してクリック イベントを処理する JavaScript コード

<script src="~/Scripts/jquery.signalR-2.0.3.js"></script>
<script src="~/SignalR/Hubs"></script>
<script>
  $(function() {
    var hub = $.connection.moduleStepHub;
    $.connection.hub.start().done(function() {
      $(".share-step").click(function() {
        var stepId = $(this).attr("data-id");
          hub.server.makeStepAvailable(stepId);
      });
    });
  });
</script>

最後に、コースとモジュールの一覧を表示して講師がその中から選択できるように、管理用のインデックス ページを変更します。最終的なインターフェイス (図 6 参照) では、講師がすぐにモジュールを選択して授業を始めることができます。

The Administrative Interface for FrontClass
図 6 FrontClass の管理用インターフェイス

図 4 のモジュール ビューを使用して、講師が生徒にコンテンツを送信します。

授業への参加

生徒からすれば、「授業に出席しなさい」というだけのかなり単純な話になります。各生徒がサイトに登録してアクセスすると、アクティブになっていてパスコードの入力が必要なコース モジュールに関する指示を受け取ります。今回のプロジェクトでは、既定のアカウント コントローラーで登録プロセスを処理します。授業のコンテンツをホストするページを作成して、生徒が授業に参加するのに必要なコードを記述します。アクティブになっている授業に生徒が参加するには、先にコースに登録しなければなりません。

教室コントローラーをビルドする: プロジェクトのルートで Controllers フォルダーを右クリックすると、新しいコントローラーを作成して名前を付けることができます。今回は ClassroomController という名前を付けます。このクラスには 2 つのプライマリ メソッドを追加します。1 つはメイン コンテンツを提供する Index で、もう 1 つはいくつかの前提条件を満たした後に要求された単元を返す GetModuleStep です。3 つ目のアクションは、授業にアクティブなモジュールがないというシナリオを処理します。モジュールの教材にアクセスするには、生徒がサイトにログインし、アクティブなモジュールのコースに登録する必要があります。

コースへの登録を許可する: ClassroomController を EnrollmentVerficationFilter で修飾しています。EnrollmentVerficationFilter は、生徒がアクセスできるコースを、講師によって設定されたエントリ コードを持っているコースに限定するために作成したものです。生徒が未登録の場合、または講師がモジュールを開始していない場合、生徒は EnrollmentController の Index アクションにリダイレクトされます (図 7 参照)。生徒は、適切なエントリ コードを持っているコースに登録できます。正常に登録されると、関連する ASP.NET Identity コンポーネントを使用して、ユーザー アカウントに申請を追加します。

The Course Lobby and Enrollment Page
図 7 コースのロビーと登録ページ

申請は UserManager クラスから追加します。UserManager クラスにアクセスするには、ApplicationDbContext のインスタンスを取得し、そのインスタンスを使用して UserStore をビルドした後、ビルドした UserStore を UserManager クラスに渡します。

var context = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);

必要なコンポーネントの準備が整ったら、ユーザーの ID を表すプリンシパルを通じてユーザーの ID を取得し、申請オブジェクトを作成します。次に、作成した申請オブジェクトをそのユーザーのアカウントに追加します。

var userId = User.Identity.GetUserId();
var courseClaim = new Claim(MvcApplication.CourseRegistrationClaimUrn,
  enroll.CourseId.ToString(CultureInfo.InvariantCulture));
userManager.AddClaim(userId, courseClaim);

ユーザーのアカウントに申請が行われると、生徒は教室にアクセスできるようになります。

教室用ビューを確認する: 図 8 に示すように、教室は 2 つの領域に分割しています。ページの上部に、現在のモジュールの概要を表示し、受講可能なあらゆる単元にジャンプするコントロールを配置します。ページの下部はいわゆる黒板になっていて、講師が共有したコンテンツを表示します。

The Virtual Chalkboard図 8 仮想黒板

このページには、わずかな DIV 要素だけをコンテンツのコンテナとして含めています。残りの部分は、ClassroomHub から送信されたメッセージ、または生徒が選択した以前の単元に基づいて取得するコンテンツを通して、JavaScript によって関連付けます。講師が新しい単元を選択すると、ClassroomHub に通知され、ClassroomHub によって教室にいるすべてのユーザーにシグナルが送られます。次に ClassroomController からデータを取得します。これにより、キャッシュが可能になります。

プロジェクトを配置する

講師は、コース、モジュール、および単元を作成して管理できます。生徒は、サイトに登録して、コースに参加できます。コースは登録申請により保護され、教室の仮想黒板は講師の操作に応じてコンテンツが更新されます。それではアプリケーションを稼働させましょう。

[ビルド] メニューからプロジェクトを発行するオプションを選択します。[Web を発行] ダイアログ ボックスが表示されます。発行先に Azure Web Sites を選択します。サインインしていない場合は資格情報の入力を求められます。その後、このプロジェクトの序盤で作成した既存のサイトを選択できます。次に発行プロファイルがダウンロードされます。発行プロファイルには、構成済みのデータベースの接続文字列と、サイトを Azure に送信するのに必要なすべての資格情報が含まれています。

このプロジェクトでは、最初にサイトを Azure ポータルに準備しました。このプロジェクトで使用している DefaultConnection 接続文字列は既に発行プロファイルに含まれているため、運用前に変更を加える必要はありません。運用で使用する接続文字列では、前回構成した Azure SQL データベースにあるアプリケーションが自動的に指定されます。

Azure Web Sites を利用する

Azure Web Sites で構成済みのエンドポイントにサイトを発行できることは、うれしい驚きでした。実際の作業も簡単で、はるかに複雑な配置手順を何年も使ってきた身としては、これは実にありがたいことです。Azure Web Sites は作業が簡単なだけではありません。次のように、数多くのツールが用意されています。

  • カスタム ドメインを追加する: ドメインを登録していくつかの DNS レコードをセットアップできる場合は、選択した一意のドメインをわずか数分でサイトに追加できます。詳細については、azure.microsoft.com/ja-jp/documentation/articles/web-sites-custom-domain-name/ (英語) を参照してください。
  • アプリケーションのセキュリティを確保する: 安価で手に入る SNI ベースの証明書を、Azure Web Sites のダッシュボードを利用して追加できます。詳細については、https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-configure-ssl-certificate/ (英語) を参照してください。
  • サイトを拡張する: プロジェクトのサイズが増え始めたら、スケールアップする (より高性能のハードウェアを使用する) か、スケールアウトする (インスタンスを増やす) ことができます。SignalR トラフィックを処理する Azure サービス バスを構成することも忘れないようにします。詳細については、bit.ly/1o6B7AC (英語) を参照してください。
  • 継続的配置を追加する: 私はごく小規模なプロジェクトでも、直接配置を行い、Git ベースのソース管理サーバーを使用します。これにより、チェックイン時に Azure 側でサイトの作成、ステージング、および自動配置が行われます。詳細については、https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-publish-source-control/ を参照してください。
  • 監視とアラートを追加する: アプリケーションで問題が発生した場合は、発生時に把握できるのが一番です。特定の種類の問題を監視して、問題が発生したときに通知を受け取ることができます。また、これらをすべてサイトのダッシュボードで構成できます。

まとめ

今回は、Visual Studio 2013 で 既定の ASP.NET MVC テンプレートに含まれるようになった ASP.NET Identity 2.0 を使用しました。機能拡張や変更点の詳細については、.NET Web Development and Tools ブログ (bit.ly/PXgQ2d、英語) を参照してください。また、クライアントとサーバー間でリアルタイム通信を行うために SignalR も使用しました。これにより、JavaScript プロキシが自動生成され、クライアントからサーバー上のコード、またはサーバーからクライアント上のコードを呼び出すことができます。EF と ASP.NET MVC 5 アプリケーションで Code First を使用してデータ モデルを作成する方法の詳細については、bit.ly/1pivbmE (英語) のチュートリアルを参照してください。

基盤となるインフラストラクチャや配置の複雑性を気にする必要がなければ、リッチ エクスペリエンスの提供ははるかに簡単になります。FrontClass アプリケーションでは、認証、承認、リアルタイムのメッセージング、および永続的なデータ ストアを利用しています。開発者は、他の開発者の取り組みのおかげでこのように数多くの構成要素を利用できるようになります。プロジェクトを運用環境に移行する際に、他の動的パーツを気にする必要はありません。

James Chambers は、ASP.NET/IIS の Microsoft MVP で、カナダ中のユーザー グループやカンファレンスで頻繁に講演しています。彼の著書『Windows Azure Web Sites』(Wrox、2013) は、eBook (http://www.amazon.co.jp/Windows-Azure-Sites-James-Chambers-ebook/dp/B00E5BI5L6/ref=kinw\_dp\_ke) で入手でき、Microsoft Virtual Academy (bit.ly/wawsmva) で紹介されています。彼のブログは jameschambers.com (英語) で、Twitter は twitter.com/CanadianJames (英語) でフォローできます。

この記事のレビューに協力してくれた技術スタッフの Chad McCallum (独立系コンサルタント) に心より感謝いたします。