🌊

ゆるやかに OWIN を ASP.NET Core に移行する

に公開

ゆるやかに OWIN を ASP.NET Core に移行する

ASP.NET アプリは ASP.NET Core に移行したほうが良いです。しかし、今までの ASP.NET アプリを一気に ASP.NET Core に移行するのはかなり大変です。

方法の一つとして、旧 ASP.NET アプリと ASP.NET Core アプリを一つのホストで混在させ、少しずつ置き換えていくというものがあります。

ゆるやかに ASP.NET を ASP.NET Core に移行する で ASP.NET 上で ASP.NET Core アプリをホストする方法を紹介しました。今回はその逆で、OWIN アプリを ASP.NET Core でホストする方法を紹介します。

前回の方法と違い、OWIN 限定になります。ASP.NET Web API ならば OWIN 上で動作させられますが、ASP.NET WebForms のように OWIN では動かせないものは利用できません。

AspNetCore2Owin で移行する

まず、次のような OWIN セルフホストアプリケーションがあったとします。

class Program
{
    public static void Main()
    {
        WebApp.Start<OwinStartup>("http://localhost:5000");
        Console.ReadLine();
    }
}

class OwinStartup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        app.UseWebApi(config);
    }
}

この ASP.NET Web API (OWIN) を ASP.NET Core でホストするように書き換えていきます。

まずは ASP.NET Core から Owin への変換のライブラリや、ASP.NET Core ホストを追加していきます。

$ dotnet add package AspNetCore2Owin
$ dotnet add package Microsoft.AspNetCore

次に、ASP.NET Core 用のスタートアップクラスを書き、Program クラスでASP.NET Core を起動するようにします。

class AspNetCoreStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // ASP.NET Core の構成。
    }

    public void Configure(IApplicationBuilder app)
    {
        // ASP.NET Core の構成。

        app.UseOwin<OwinStartup>(); // これを追加。
    }
}

class Program
{
    public static void Main(string[] args)
    {
        var host = WebHost.CreateDefaultBuilder<AspNetCoreStartup>(args)
            .Build();
        host.Run();
    }
}

これで完了です。プロジェクトを起動してください。プロジェクト内の ASP.NET Web API のエンドポイントを呼び出してテストしてみてください。今まで通り (Owin セルフホスト通り) に動作するはずです。

OWIN セルフホストの例を紹介しましたが、理屈上は、OwinStartupAttribute を利用したプロジェクトでも応用ができます。また、ASP.NET Web API を OWIN なしで利用している場合でも、一度 OWIN 化すればいいだけです。

仕組み

マイクロソフトは OWIN / ASP.NET Core の相互運用のために Microsoft.AspNetCore.Owin というパッケージを提供しています。(詳しくは Open Web Interface for .NET (OWIN) と ASP.NET Core を参照してください)

このパッケージの機能として、ASP.NET Core で OWIN ミドルウェアを動作させるというものがあります。ただ、ここでいう OWIN ミドルウェアは、ちょっと普通の OWIN ミドルウェアと異なります。

AspNetCore2Owin は OWIN アプリケーションを Microsoft.AspNetCore.Owin でいう OWIN ミドルウェアに変換しています。

課題

あくまで OWIN アプリを動作させているだけですので、SystemWeb の HttpContext はありません。ピュアな OWIN アプリ (ASP.NET Web API を含む) であれば問題ありませんが、SystemWeb でホストしていて、SystemWeb の HttpContext に依存しているアプリを動作させるのは厄介です。

その部分を書き換えるか、SystemWeb の HttpContext をなんとかしてごまかす必要があります。

また、OWIN は .NET Framework のみをサポートしているようです。最新の ASP.NET Core (現時点だと 8 や 9) でも動作はしますが、サポートが必要な場合は .NET Framework + ASP.NET Core 2.3 を使うことになります。

最後に

今回紹介した AspNetCore2Owin は ASP.NET Web API や OWIN から ASP.NET Core への移行で使える手段です。これらを混在できるのが強みで、一気に書き換える書き換えるのではなく、少しずつ移行ができます。

どうやって移行するかを計画がなかなか立てられないなら、AspNetCore2Owin を利用して、OWIN と ASP.NET Core を混在させ、新機能から ASP.NET Core で書き始めてみませんか?

Discussion