ゆるやかに 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