特に理由は無いですが、OWIN と Windows Azure の Worker Role を使って遊んでみたかったので、実際に試してみました。
OWIN はかなり力が入れられているみたいなので、早めにいろいろ試しておいた方が良いと思いました。
下準備
まずは Windows Azure の Worker Role プロジェクトを作ります。ここの説明はもう要らないですよね?
プロジェクトが作成出来たら、まずエンドポイントを追加しておきます。これをしておかないと外部からアクセスできないので注意。
プロトコルを 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 分とか速くなりましたな。
パッと見では 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 使えよっていうツッコミは無しで(