Azure Worker ロールで OWIN をホストする

このチュートリアルでは、Microsoft Azure worker ロールで OWIN をセルフホストする方法について説明します。

Open Web Interface for .NET (OWIN) は、.NET Web サーバーと Web アプリケーションの間の抽象化を定義します。 OWIN はサーバーから Web アプリケーションを切り離します。これにより、OWIN は、Azure worker ロール内など、IIS の外部で、独自のプロセスで Web アプリケーションを自己ホストするのに最適です。

このチュートリアルでは、Microsoft Azure worker ロール内で OWIN アプリケーションをセルフホストする方法について説明します。 worker ロールの詳細については、「 Azure 実行モデル」を参照してください。

チュートリアルで使用するソフトウェアのバージョン

Microsoft Azure プロジェクトを作成する

管理者特権で Visual Studio を起動します。 Azure Compute Emulator を使用してアプリケーションをローカルでデバッグするには、管理者特権が必要です。

[ ファイル ] メニューの [ 新規作成] をクリックし、[ プロジェクト] をクリックします。 [インストールされているテンプレート] の [Visual C#] で、[クラウド] をクリックし、[Windows Azure Cloud Service] をクリックします。 プロジェクトに「AzureApp」という名前を付け、[OK] をクリック します

ファイル構造イメージの例

[ 新しい Windows Azure Cloud Service ] ダイアログで、[ Worker ロール] をダブルクリックします。 既定の名前 ("WorkerRole1") のままにします。 この手順では、ソリューションに worker ロールを追加します。 [OK] をクリックします。

[Azure クラウド サービス] ダイアログ ボックス

作成される Visual Studio ソリューションには、次の 2 つのプロジェクトが含まれています。

  • "AzureApp" は、Azure アプリケーションのロールと構成を定義します。
  • "WorkerRole1" には、worker ロールのコードが含まれています。

一般に、Azure アプリケーションには複数のロールを含めることができますが、このチュートリアルでは 1 つのロールを使用します。

ソリューション エクスプローラーのダイアログ ボックス

OWIN Self-Host パッケージを追加する

[ツール] メニューの [NuGet パッケージ マネージャー] をクリックし、[パッケージ マネージャー コンソール] をクリックします。

[パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

Install-Package Microsoft.Owin.SelfHost

HTTP エンドポイントを追加する

ソリューション エクスプローラーで、AzureApp プロジェクトを展開します。 [ロール] ノードを展開し、[WorkerRole1] を右クリックして、[プロパティ] を選択 します

HTTP エンドポイントの追加の図

[エンドポイント] をクリックして、[エンドポイントの追加] をクリックします。

[ プロトコル ] ドロップダウン リストで、[http] を選択します。 [ パブリック ポート] と [ プライベート ポート] に「80」と入力します。 このポート番号は別の番号でもかまいません。 パブリック ポートは、クライアントがロールに要求を送信するときに使用するものです。

プロトコルの選択例の画像

OWIN スタートアップ クラスを作成する

ソリューション エクスプローラーで、WorkerRole1 プロジェクトを右クリックし、[クラス追加] / を選択して新しいクラスを追加します。 クラスに Startup という名前を付けます。

すべての定型コードを次のように置き換えます。

using Owin;

namespace WorkerRole1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseWelcomePage("/");
        }
    }
}

拡張メソッドは UseWelcomePage 、サイトが動作していることを確認するために、アプリケーションに単純な HTML ページを追加します。

OWIN ホストを起動する

WorkerRole.cs ファイルを開きます。 このクラスは、worker ロールが開始および停止されたときに実行されるコードを定義します。

次の using ステートメントを追加します。

using Microsoft.Owin.Hosting;

クラスに IDisposable メンバーを WorkerRole 追加します。

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

メソッドで OnStart 、ホストを開始する次のコードを追加します。

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;

    // New code:
    var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
    string baseUri = String.Format("{0}://{1}", 
        endpoint.Protocol, endpoint.IPEndpoint);

    Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
        "Information");

    _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
    return base.OnStart();
}

WebApp.Start メソッドは OWIN ホストを起動します。 クラスの Startup 名前は、 メソッドの型パラメーターです。 慣例により、ホストはこのクラスの メソッドを Configure 呼び出します。

OnStop_app インスタンスを破棄するには、 をオーバーライドします。

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

WorkerRole.cs の完全なコードを次に示します。

using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        private IDisposable _app = null;

        public override void Run()
        {
            Trace.TraceInformation("WorkerRole entry point called", "Information");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.TraceInformation("Working", "Information");
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
            string baseUri = String.Format("{0}://{1}", 
                endpoint.Protocol, endpoint.IPEndpoint);

            Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
                "Information");

            _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
           return base.OnStart();
        }

        public override void OnStop()
        {
            if (_app != null)
            {
                _app.Dispose();
            }
            base.OnStop();
        }
    }
}

ソリューションをビルドし、F5 キーを押して、Azure Compute Emulator でアプリケーションをローカルで実行します。 ファイアウォールの設定によっては、エミュレーターをファイアウォール経由で許可する必要がある場合があります。

コンピューティング エミュレーターは、エンドポイントにローカル IP アドレスを割り当てます。 IP アドレスは、コンピューティング エミュレーター UI を表示することで確認できます。 タスク バーの通知領域でエミュレーター アイコンを右クリックし、[ コンピューティング エミュレーター UI の表示] を選択します。

コンピューティング エミュレーターの図

[サービスのデプロイ]、[デプロイ [id]、サービスの詳細] で IP アドレスを見つけます。 Web ブラウザーを開き、http:// アドレスに移動します。 address はコンピューティング エミュレーターによって割り当てられた IP アドレスです。たとえば、 http://127.0.0.1:80です。 OWIN のウェルカム ページが表示されます。

IP アドレスの検索の図

Azure にデプロイ

この手順では、Azure アカウントが必要です。 まだお持ちでない場合は、わずか数分で無料試用版アカウントを作成できます。 詳細については、「 Microsoft Azure 無料試用版」を参照してください。

ソリューション エクスプローラーで、AzureApp プロジェクトを右クリックします。 [発行] を選択します。

AzureApp の発行の図

Azure アカウントにサインインしていない場合は、[ サインイン] をクリックします。

サインインの例の画像

サインインしたら、サブスクリプションを選択し、[ 次へ] をクリックします。

サブスクリプション イメージの選択の例

クラウド サービスの名前を入力し、リージョンを選択します。 Create をクリックしてください。

クラウド サービスの作成、イメージの例

[発行] をクリックします。

新しく作成されたAzure アプリケーションを発行する、画像の例

[Azure アクティビティ ログ] ウィンドウには、デプロイの進行状況が表示されます。 アプリがデプロイされたら、 を参照します http://appname.cloudapp.net/ここで、appname はクラウド サービスの名前です。

その他のリソース