先週、OWINって何?Microsoft MVPに聞いてみよう! に参加してきました。
サブディレクトリに、OWIN の Middleware を適用する方法を教えて頂いたので、試してみました。Web API へのリクエストだけに ロギング Middleware を追加するシナリオで実装しました。
ロギングの Middleware をクラスライブラリに実装する
ClassLibrary プロジェクトに NuGet パッケージをインストールします。
- Install-Package Microsoft.Owin
ロギングの Middleware を実装します。
#CustomLoggerMiddleware.cs public class CustomLoggerMiddleware : OwinMiddleware { public CustomLoggerMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(IOwinContext context) { Trace.TraceInformation("Web API Start"); await base.Next.Invoke(context); Trace.TraceInformation("Web API End"); } }
Invoke の前後にトレースを入れるだけのシンプルなロギングです。
Webアプリケーションを実装する
空のWebApplication プロジェクトに NuGet パッケージをインストールします。
- Install-Package Microsoft.AspNet.WebApi.Owin
- Install-package Microsoft.Owin.Host.SystemWeb
OWIN パイプラインに Middleware を追加します。
#Startup.cs public class Startup { public void Configuration(IAppBuilder app) { app.Map("/api", subApp => { subApp.Use<CustomLoggerMiddleware>(); var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); subApp.UseWebApi(config); }); } }
引数の app の Use メソッドに Middleware を追加すると、すべてのリクエストに対して Middleware が動きます。IAppBuilder の拡張メソッドである Map メソッドを使っているのがポイントです。subApp の Use メソッドに Web API と CustomLogger の Middleware を追加することで、"/api" から始まる URL のリクエストに対して Middleware が動きます。
Web API の Controller を追加します。
#TestController.cs // φ(..) "api/test" では、404 になるので注意! [Route("test")] public class TestController : ApiController { // GET api/test public string Get() { Trace.TraceInformation("TestController.Get()"); return "Hello OWIN !"; } }
GETで "api/test” にリクエストすると、「Hello OWIN !」を返すシンプルな Web API です。Route 属性で "api/test" と設定すると、404 エラーが発生して Get メソッドを呼び出せません。"/api" から始まる URL のリクエストに対して Web API が追加されているので、"/api" を省略して "test" と設定する必要があります。
実行結果
GETで "api/test” にリクエストすると、Visual Studio の出力ウィンドウには、以下のようにログが表示されます。
まとめ
OWIN の複数の Middleware を組み合わせたときに、機能の重複を回避したり、特定のリクエストのみに限定したい場合などは、この方法が使えそうです。ただ、今回のシナリオのように、Web API のリクエストだけをロギングするのであれば、OWIN の Middleware でなく、Web API の ActionFilter で作るのもアリです。