ROMANCE DAWN for the new world

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

OWIN で ASP.NET Web API をマルチホストする

OWIN を少し理解できたので、ASP.NET Web API をマルチホストしてみました。コンソールアプリ、IIS の Webアプリ、Windows Azure の WebRole の3つでホスティングします。

ソリューション構成は、こんな感じです。

solution

Web API のロジックをクラスライブラリにする

WebApiLibrary プロジェクトに NuGet パッケージをインストールします。

  • Install-Package Microsoft.AspNet.WebApi.Owin

GETで"api/test"にリクエストすると、「Hello OWIN !」を返すシンプルな Web API です。

#TestController.cs
public class TestController : ApiController
{
    public string Get()
    {
        return "Hello OWIN !";
    }
}
#WebApiConfig.cs
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

コンソールアプリでホストする

ConsoleApplication プロジェクトに NuGet パッケージをインストールします。

  • Install-Package Microsoft.AspNet.WebApi.Owin
  • Install-Package Microsoft.Owin.Host.HttpListener
  • Install-Package Microsoft.Owin.Hosting

OWIN パイプラインに Web API を追加します。

#Startup.cs
[assembly: OwinStartup(typeof(ConsoleApplication.Startup))]
namespace ConsoleApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }
    }
}
#Program.cs
class Program
{
    static void Main(string[] args)
    {
        using (WebApp.Start("http://localhost:8080/"))
        {
            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }
    }
}

IIS の Webアプリでホストする

空のWebApplication プロジェクトに NuGet パッケージをインストールします。

  • Install-Package Microsoft.AspNet.WebApi.Owin
  • Install-package Microsoft.Owin.Host.SystemWeb

OWIN パイプラインに Web API を追加します。

#Startup.cs
[assembly: OwinStartup(typeof(WebApplication.Startup))]
namespace WebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }
    }
}

Windows Azure の WebRole でホストする

上記の WebApplication と同じです。

実行結果

Google Chrome アプリの Postman で実行結果を確認してみます。

result

コンソールアプリ以外のURLでも、同じ結果が返されます。

まとめ

OWIN を利用することで、何でホストしても画一的な実装で書けるのは、大きなメリットです。サーバーとアプリを抽象化するだけでなく、ミドルウェアとして機能を追加できるところも面白いです。Web API 以外では、SignalR や Nancy のほかに、認証系のライブラリもありますし、第3のホストライブラリである Helios にも注目したいです。これからの One ASP.NET を語るうえで、OWIN は欠かせない技術であることは間違いなく、今後の進化に期待が高まります。