miso_soup3 Blog

主に ASP.NET 関連について書いています。

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 を作成し適用します。

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)

f:id:miso_soup3:20131111005422p:plain

プロジェクトの 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

実行後、以下のようなメッセージがでます。

f:id:miso_soup3:20131111005842p:plain

ブラウザなどで、アクセスすると 「Hello World」メッセージが表示されます。

f:id:miso_soup3:20131111010025p:plain

補足として、「/?」を引数にすると、ヘルプが表示されます。

f:id:miso_soup3:20131111010433p:plain

ポート番号等々いろいろ指定できます。

OwinHost.exe を VS 2013 の F5 デバッグで起動する

上の方法が面倒ということで、VS2013 の F5 デバッグ(メニューのデバッグ>デバッグ実行)から先ほどの OwinHost.exe を実行します。
NuGet で OwinHost をインストールしたことで、すでに実行できる環境になっています。

プロジェクトのプロパティ、Web のセクションにて、サーバーを「OwinHost」を選択します。

f:id:miso_soup3:20131111010848p:plain

保存した後、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 作成は以上です。実行してみると、次のようにログがでます。

f:id:miso_soup3:20131111012900p:plain

ちなみに、Startup.cs で カスタム Middleware の適用コードを何度も書くと、

app.Use<MyLoggerMiddleware>();
app.Use<MyLoggerMiddleware>();
app.Use<MyLoggerMiddleware>();
app.Use<MyLoggerMiddleware>();

このようにログがでます。
f:id:miso_soup3:20131111013119p:plain