しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

OWIN を使って Windows Azure の Worker Role で HTTP サービスを公開する

特に理由は無いですが、OWIN と Windows Azure の Worker Role を使って遊んでみたかったので、実際に試してみました。

OWIN はかなり力が入れられているみたいなので、早めにいろいろ試しておいた方が良いと思いました。

下準備

まずは Windows Azure の Worker Role プロジェクトを作ります。ここの説明はもう要らないですよね?

プロジェクトが作成出来たら、まずエンドポイントを追加しておきます。これをしておかないと外部からアクセスできないので注意。

f:id:shiba-yan:20130707155337p:plain

プロトコルを http に、ポートは両方とも 80 番にしておきます。

そして、作成した Worker Role プロジェクトに、以下の NuGet パッケージをインストールします。これは HttpListener を使って OWIN アプリケーションをホストするために必要なパッケージとなります。

Install-Package Microsoft.Owin.Host.HttpListener –Pre
Install-Package Microsoft.Owin.Hosting –Pre

これだけインストールしてしまえば、これで Worker Role で OWIN を利用した各種フレームワークを動作させることが出来ます。

後は WebApp クラスを使って HTTP サーバを立ち上げるだけですが、基本的に同じコードになるので RoleEntryPoint 周りをテンプレート化したコードを置いておきます。

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app;

    public override void Run()
    {
        while (true)
        {
            Thread.Sleep(10000);
        }
    }

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

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

        _app = WebApp.Start(url);

        return base.OnStart();
    }

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

        base.OnStop();
    }
}

コードに関しては Host ASP.NET Web API in an Azure Worker Role : The Official Microsoft ASP.NET Site をベースに最新版の Katana に合わせて修正しました。

OWIN に固有の設定はお馴染みの Startup クラスを作成して、その中の Configuration メソッドで行います。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // ミドルウェアの設定を行う
    }
}

ここまで出来たら準備完了なので Nancy, Web API, SignalR の順に動かしていきます。

Nancy を使う

Nancy を使ってサービスを公開する場合には、以下の NuGet パッケージをインストールします。

Install-Package Nancy.Owin

インストールが終わったら Startup クラスで Nancy を有効にするだけです。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Nancy を有効にする
        app.UseNancy();
    }
}

Nancy だけ実際にデプロイして確認しておきました。Worker Role の新規デプロイに 5,6 分とか速くなりましたな。

f:id:shiba-yan:20130707155702p:plain

パッと見では Web Role っぽく見えますが Worker Role で動いてます。

Web API を使う

ASP.NET Web API を使ってサービスを公開する場合には、以下の NuGet パッケージをインストールします。

Install-Package Microsoft.AspNet.WebApi.Owin -Pre

インストールが終わったら、Nancy の時と同じように Web API を有効にするだけです。Nancy とは違って、ルーティングの設定が最低限必要になります。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Web API の属性ベースのルーティングを有効にする
        var config = new HttpConfiguration();

        config.MapHttpAttributeRoutes();

        app.UseWebApi(config);
    }
}

SignalR を使う

SignalR を使ってサービスを公開する場合には、以下の NuGet パッケージをインストールします。

SignalR は 2.0 から OWIN ベースに完全移行したので、Core ライブラリだけインストールすれば OWIN で動かすことが出来ますが、このパッケージを使うのが便利です。

Install-Package Microsoft.AspNet.SignalR.SelfHost -Pre

インストールが完了すれば、今までと同じように Startup クラスで設定を行うだけです。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // SignalR を有効にする
        app.MapHubs();
    }
}

まとめ

OWIN を使えば Nancy, Web API, SignalR など各種フレームワークを一貫性のある方法で使うことが出来ました。これは OWIN の最大の特徴だと思います。

昔は HttpListener を直接 Worker Role で使うようなコードが多かったですが、今では OWIN の HttpListener ホストを使うことでめんどくさいことを全て OWIN に丸投げできます。実は OWIN 自体に認証周りの仕組みが追加されているので、セルフホストでもフォーム認証やフェデレーション認証を使うことが出来そうです。

あ、Web Role 使えよっていうツッコミは無しで(