MS_OWIN - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

OWIN

概要

OWIN (Open Web Interface for .NET)

  • .NET の Web サーバと Web アプリケーションを接続するためのインタフェース。
  • 新しい HTTP Server のプログラミング抽象化レイヤーを定義する。
  • OWIN 統合により、One ASP.NET の Pluggable を促進する。
  • OWIN のリファレンス実装は「Katana プロジェクト」。

経緯

昨今、色々と技術的な変化が早いため、

  • MVC 1-5 は .NET Framework のサイクルから外れ、
  • また、System.Web(≒ IIS)からの脱却が必要になってきて、

OWIN が登場した。

目標

  • OWIN の目標 & 達成したこと。

    • System.Web(≒ IIS)から脱却し、性能の向上を可能にした。
    • .NET Framework のサイクルから外れた早いリリースを可能にした。
  • これらは、ASP.NET Coreに引き継がれ役立っている。

補足(なぜ System.Web からの脱却が必要だったか): System.Web
IISと密結合しており、次の問題を抱えていた。

問題 内容
ホストの固定 IIS 以外(自己ホスト、Linux)で動かせない
重い HttpContext を含む巨大なオブジェクト グラフが要求ごとに作られる
更新できない System.Web.dll は .NET Framework の一部。単体でバージョンアップできない

OWIN はこれを「辞書とデリゲートだけ」という
最小のインターフェイスに置き換えることで解いた。
この発想は Ruby の Rack、Python の WSGI と同じ系譜にある。

主要なデータ構造

environment dictionary

  • HttpContext から脱却し、環境を保持する environment dictionary。
  • HTTP request and response を処理するのに必要なデータは保持される。
IDictionary<string, object>

application delegate

コンポーネントの間は下記の function signature で呼ばれる。

Func<IDictionary<string, object>, Task>

補足(この 2 つが全て): OWIN の仕様は実質この 2 行に尽きる。
「リクエスト情報の入った辞書を受け取り、Task を返す関数」を
数珠つなぎにするだけで、Web アプリケーションのパイプラインが構成される。
ASP.NET Coreのミドルウェア
RequestDelegate = Func<HttpContext, Task>)は
型が HttpContext に変わっただけで、構造はそのままである。

OWINミドルウェア

以下の様な、OWIN ミドルウェアが存在する。

OWINミドルウェア作成

この「ミドルウェア」を自作すればパイプライン上で挙動をカスタマイズできる。

シンプルに

「セルフホストや OWIN ミドルウェアを使用するために、
パイプラインを OWIN 化すること。」

と捉えると良い。

参考

OWIN is dead ?

以下に「これからは ASP.NET 5。(死に切ってはいないけれど) OWIN is dead!!」とある。

今では完全に OWIN と Katana Project は止まっているらしい。
(ASP.NET 5 は、現在はASP.NET Coreと名称が変更されている。)

補足

OWIN と Katana の意味が長々明確ではありませんでしたが、

  • Katana Project が止まって、
  • Katana Project 所有の仕様である OWIN も止まった

ということだったようでしたが、その後、OWIN の仕様は、
ASP.NET 5、ASP.NET Coreと引き継がれて生きているようです。

  • ASP.NET Coreは、OWIN をサポートしています。
  • ASP.NET Coreアプリケーションとミドルウェアは、
    OWIN ベースのアプリケーション、サーバ、ミドルウェアと相互運用できます。

ただし、OWIN の上でASP.NET Coreが動くのではなくて、
ASP.NET Core自体が OWIN 互換レイヤーを実装することで
サポートしたようです。

補足(現在の結論): この整理はそのとおりで、その後さらに進んだ。

対象 現状
OWIN 仕様 / Katana 開発は完全に停止。新規に学ぶ必要はない
Microsoft.Owin.* パッケージ .NET Framework 版 ASP.NET の既存資産としては現役
ASP.NET Core の OWIN 互換レイヤ UseOwin() として存在するが、使う場面はまず無い
思想 ミドルウェア パイプラインとして ASP.NET Core に完全に継承された

つまり「OWIN is dead」は製品としては正しく、思想としては誤りである。
現在 ASP.NET Core
app.Use(async (context, next) => { ... }) と書くとき、
それは OWIN が提示したモデルそのものである。

なお、実務上の注意として、
Microsoft.Owin.*.NET Core 以降に移植されていない
ASP.NET Identity の OWIN ミドルウェア
UseCookieAuthentication 等)に依存した既存アプリを移行する場合、
ASP.NET Coreの認証 API への書き直しが必要になる。
詳細はASP.NET Coreへの移行を参照。

Microsoft Learn


Tags: 移行, .NET開発, OWIN

⚠️ **GitHub.com Fallback** ⚠️