ASP.NET vNext はこれまで使われてきた System.Web.dll を捨てた結果、ランタイムとして IIS や ISAPI に依存しなくなりました。その代わり HTTP の処理を実際に行うレイヤーが必要となります。
既に http.sys を利用したものや、Node.js でも使われている libuv ベースのサーバーがリリースされていますので、簡単にまとめておきます。
Servers · aspnet/Home Wiki · GitHub
GitHub Wiki にもサーバーのまとめは上がっているのですが、内容が少し古くなっているので補足も兼ねて。
WebListener
Microsoft.AspNet.Server.WebListener はこれまでもよく使われていた HttpListener と同じようなもので、Windows のカーネルモードドライバである http.sys を直接利用することで、HTTP 周りのオーバーヘッドを出来る限り小さくしています。
残念ながらソースコードは GitHub で公開されていません。
ちなみに BCL にある HttpListener ではなくて、新しく実装された Microsoft.Net.Http.Server というライブラリを使ってサーバーが実装されています。*1
Kestrel
Kestrel は今回、完全に新しく実装されたサーバーです。最初にも軽く触れましたが、Node.js で使われている libuv というクロスプラットフォームな非同期 I/O 処理を実装するためのライブラリを使っています。
https://github.com/aspnet/KestrelHttpServer
libuv を使うことで得られる最大のメリットが Windows に依存しないという点です。libuv 自体がプラットフォーム固有の部分をラップしてくれているので、Kestrel は libuv が提供する TCP 周りの機能を利用して HTTP サーバーを実装しています。
しかし、まだ開発中というのもあり現状は Windows と OS X のみ対応となっています。
Adding linux support by djsell · Pull Request #20 · aspnet/KestrelHttpServer · GitHub
Linux へ対応するための PR も送られていますが、CPU bitness 周りの問題でマージはされていません。*2
IIS (Helios)
Microsoft.AspNet.Server.IIS は既にこのブログでも何回か取り上げましたが、IIS のネイティブ API を利用して System.Web.dll をバイパスし、パフォーマンスを改善するプロジェクトである Helios をベースとして構築されています。
OWIN を加速させる IIS と Helios の関係 - しばやん雑記
ネイティブ API を叩いているので、x86 / x64 それぞれに Interop ライブラリが付いてくるところも、OWIN 用の Helios と変わりません。
IIS を利用している分、直接 http.sys を叩いている WebListener より重いですが、その代わりに既存の IIS モジュールを活用できる点が特徴です。
ASP.NET Hosting
サーバーの紹介が終わったので、ASP.NET vNext アプリケーションはどのように読み込まれて実行されているのか調べました。
簡単に説明してしまうと、ASP.NET vNext アプリケーションを実行しているのは Microsoft.AspNet.Hosting というライブラリになります。
https://github.com/aspnet/Hosting
このホスティングライブラリを使うことで、各サーバーごとに Startup コードを実行する処理を書く必要なく ASP.NET vNext アプリケーションを動かすことが出来るというわけです。
これまで紹介したサーバーとの関係を大雑把な図にしました
WebListener と Kestrel は KLR 上で動かす必要がありますが、IIS からは完全に独立して動く形になります。それに対して IIS (Helios) は IIS のモジュールとして実装されているので、インプロセスで動作します。
このあたりは project.json のコマンド定義からも読み取れます。
"commands": { "WebListener": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5002", "Kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004", "run": "run server.urls=http://localhost:5003" },MusicStore/project.json at master · aspnet/MusicStore · GitHub
Helios が k のサブコマンドに無い理由が理解できました。
まとめ
最後に各サーバーの簡単なまとめだけをしておきます。
- WebListener
- IIS に依存しない / http.sys を直接使うので軽量 / プロダクションでどこまで使えるか未知数
- Kestrel
- クロスプラットフォーム / Node.js で実績のある libuv を利用 / Linux には現状は未対応
- IIS (Helios)
- 既存の Web サーバーと資産を利用可能 / Azure Web サイトでも既に使える / まだ開発中*3
まだ 1.0.0-beta2 なので、これからも RTM に向けて開発が進んでいくことになります。