Katana で Hello, world
先日、Win8.1/VS 2013リリース記念勉強会でセッションしてきました。資料はここです→One ASP.NET, OWIN & Katana この時途中まで行ったデモの手順を、ブログに記録しておきます。
「Hello World」を表示する簡単な OWIN 対応 Webアプリを作成し、
Visual Studio 2013 にて、Katana の OwinHost.exe でホストする方法、IIS でホストする方法について書きます。(どちらも F5 による起動を行うことができます。)最後におまけとして、ロギングを行う Middleware を作成し適用します。
参考
- Katana プロジェクトの概要
- An Overview of Project Katana
- Getting Started With Custom Web Server in Visual Studio 2013 RC
Hello World コード
ASP.NET Empty プロジェクトを作成します。(Visual Studio 2013 にて、新規作成>プロジェクト>ASP.NET Web アプリケーション>Empty)
Startup.cs を用意し、Helloworld のテキストを返すコードを書きます。
ソリューションエクスプローラーで、プロジェクトを右クリック>追加>新しい項目>Owin Startup クラスを選択します。 コードは以下の通り。
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(WebApplication40.Startup1))] namespace WebApplication40 { public class Startup1 { public void Configuration(IAppBuilder app) { app.Run(context => { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello World!"); }); } } }
Owin Startup クラスを追加したとき、同時にNuGetから「Owin」「Microsoft.Owin」が追加されます。が、現在、この後で取り込むパッケージの関係により、「Microsoft.Owin」を更新する必要があります。
パッケージマネージャコンソールで、以下のコマンドを打ち、Microsoft.Owin の 2.0.1 を 取り込みます。
update-package Microsoft.Owin
リビルドを行います。 (ビルド>ソリューションのリビルド)
Hellow World コードは以上です。
OwinHost.exe でホストする
作成した HelloWorld コードを、Katana の OwinHost.exe でホストするには、コマンドから実行する方法に加えて、Visual Studio の F5 から実行する方法もあります。
OwinHost.exe をコマンドから実行する
NuGet で「OwinHost」をインストールします。
install-package OwinHost
インストールすると、”これインストールすると VS2013 以外でプロジェクト開けなくなるよ”とダイアログがでるので OK します。
プロジェクトの root フォルダにて、先ほどNuGet から取り込んだ「OwinHost」パッケージ内にある「OwinHost.exe」を実行します。(..\packages\OwinHost.2.0.1\tools\OwinHost を打ち込んで Enter)
プロジェクトの root フォルダ:
Web.config や bin フォルダがあるフォルダ。(例:C:\Users\hogehoge\Documents\visual studio 2013\Projects\WebApplication40\WebApplication40)
OwinHost.exe があるフォルダ:
packages フォルダ内にある。(例:C:\Users\hogehoge\Documents\visual studio 2013\Projects\WebApplication40\packages\OwinHost.2.0.1\tools)
コマンドプロンプトの開き方:
プロジェクトの root フォルダにて、Shift + 右クリックから「コマンドウィンドウをここで開く」を選択。「..\packages\OwinHost.2.0.1\tools\OwinHost」を打ち込む)
実行したとき、OwinHost はプロジェクト内にある Startup.cs を探します。探す手掛かりは、Katana プロジェクトの概要に記述されている通り 3 つあります。 今回の場合、この内の 2 つめによって Startup.cs を特定します。
・web.config ファイルに key="owin:AppStartup" が設定された appSetting がある場合、ローダーはその設定値を使用する。値は有効な .NET 型の名前でなければならない。
・アセンブリに属性 [assembly: OwinStartup(typeof(MyStartup))] が含まれる場合、ローダーは属性値で指定された型を使用する。
・上記の条件のどちらにも当てはまらない場合、ローダーは読み込んだアセンブリをスキャンし、シグネチャ void Configure(IAppBuilder app) に一致するメソッドが設定された Startup という名前の型を探す。Katana プロジェクトの概要 http://msdn.microsoft.com/ja-jp/magazine/dn451439.aspx
実行後、以下のようなメッセージがでます。
ブラウザなどで、アクセスすると 「Hello World」メッセージが表示されます。
補足として、「/?」を引数にすると、ヘルプが表示されます。
ポート番号等々いろいろ指定できます。
OwinHost.exe を VS 2013 の F5 デバッグで起動する
上の方法が面倒ということで、VS2013 の F5 デバッグ(メニューのデバッグ>デバッグ実行)から先ほどの OwinHost.exe を実行します。
NuGet で OwinHost をインストールしたことで、すでに実行できる環境になっています。
プロジェクトのプロパティ、Web のセクションにて、サーバーを「OwinHost」を選択します。
保存した後、F5 を押すとデバッグが実行できます!ブラウザも自動で起動します。
IIS でホスト
この HelloWorld コードを IIS でホストするには、NuGet で「Microsoft.Owin.Host.SystemWeb
」をインストールします。
install-package Microsoft.Owin.Host.SystemWeb
これでもう IIS(IIS Express)で実行できます。(プロジェクトのプロパティにて、Web のサーバーを「IIS Express」に戻すことを忘れずに…。)
カスタム Middleware を作る
HelloWorld コードは以上ですが、もういっちょ ロギングもどきの カスタム Middleware を作ってみます。
プロジェクト内で、以下の MyLoggerMiddleware クラスを作成します。
public class MyLoggerMiddleware : OwinMiddleware { public MyLoggerMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(IOwinContext context) { Debug.WriteLine("★ My Logger Start"); await this.Next.Invoke(context); Debug.WriteLine("★ My Logger End"); } }
(↑ using System.Diagnostics; いります)
Startup.cs に、以下のようにコードを 2 行追加します。
public class Startup1 { public void Configuration(IAppBuilder app) { app.Use<MyLoggerMiddleware>(); // ←追加 app.Run(context => { Debug.WriteLine("-- My Hello World Code"); //←追加 context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello World!"); }); } }
カスタム Middleware 作成は以上です。実行してみると、次のようにログがでます。
ちなみに、Startup.cs で カスタム Middleware の適用コードを何度も書くと、
app.Use<MyLoggerMiddleware>(); app.Use<MyLoggerMiddleware>(); app.Use<MyLoggerMiddleware>(); app.Use<MyLoggerMiddleware>();
このようにログがでます。