ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

OWIN の Middleware をサブディレクトリに適用する

先週、OWINって何?Microsoft MVPに聞いてみよう! に参加してきました。

connpass.com

サブディレクトリに、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 の出力ウィンドウには、以下のようにログが表示されます。

logger

まとめ

OWIN の複数の Middleware を組み合わせたときに、機能の重複を回避したり、特定のリクエストのみに限定したい場合などは、この方法が使えそうです。ただ、今回のシナリオのように、Web API のリクエストだけをロギングするのであれば、OWIN の Middleware でなく、Web API の ActionFilter で作るのもアリです。