しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

OWIN を加速させる IIS と Helios の関係

突如として公開された Helios という謎のライブラリを知っている人はどのくらいいますか?

Twitter ではこちらのブログ記事が割とシェアされていたりするんですが、冒頭に書いてある通り MVP Global Summit のセッションで発表されたライブラリです。*1

Checking out the Helios IIS Owin Web Server Host - Rick Strahl's Web Log

あらためて紹介しておくと、Helios とは OWIN を IIS 上で動かすための、非常に軽量なライブラリです。既に NuGet で公開されているので、誰でも自由に試すことが出来ます。

NuGet Gallery | Microsoft.Owin.Host.IIS 0.1.0-pre

これで OWIN のホスティングライブラリは 3 種類になりました。ちょっと列挙してみます。

  • Microsoft.Owin.Host.SystemWeb
    • OWIN を ASP.NET 上で使うためのライブラリ
  • Microsoft.Owin.Host.HttpListener
    • OWIN を HttpListener 上で使うためのライブラリ
  • Microsoft.Owin.Host.IIS
    • OWIN を IIS 上で使うためのライブラリ

このように考えると、頭にスッと入ってくるかもしれません。今までの Microsoft.Owin.Host.SystemWeb は ASP.NET 上に OWIN のラッパーを作成したような形になっているので、誰が考えてもオーバーヘッドが大きいわけです。

しかし、今回の Helios こと Microsoft.Owin.Host.IIS では ASP.NET のパイプラインを完全にバイパスして、IIS のネイティブな API 上に非常に薄い OWIN に変換するだけの層を実装したものです。ASP.NET のパイプラインを通らないので、用意されているマネージドモジュールは使えないと考えた方が良いでしょう。

例えば ASP.NET では広く使われてきたフォーム認証を行う FormsAuthenticationModule は、OWIN と Helios では完全に OWIN Security Middleware に置き換えられました。流石に OWIN Security Middleware は後発だけあって、FormsAuthenticationModule の欠点が色々と解消されています。

NuGet Gallery | Packages matching Microsoft.Owin.Security

ちなみに、既に NuGet 上に数多くの Middleware が公開されていて、すぐにでも使える状態になっています。

話を戻して Microsoft.Owin.Host.IIS についてですが、NuGet パッケージの依存関係を確認すると Microsoft.AspNet.Loader.IIS というパッケージに依存しており、いろいろ調べたところ IIS との連携を行っているのはこっちのライブラリのようです。IIS に用意されている Web Server Core API を P/Invoke や COM Interop を使って利用しているみたいです。

Web Server Core API Reference

実際に Microsoft.AspNet.Loader.IIS のパッケージの中には x86 と x64 向けの Interop DLL が入っていることが確認できます。

f:id:shiba-yan:20131129124819p:plain

Windows は x86 と x64 の DLL を 1 プロセスに混ぜて使うことは出来ないので、DLL が分かれているというだけです。内部の実装はほぼ同じでしょう。

冒頭に紹介した記事では Helios 上の Web API パフォーマンスが HttpHandler より良いという、正直ぶっ飛んだ結果が出ているので今すぐにでも使いたいという人が出てきそうですが、バージョンから分かるように 0.1.0 のプレリリース版、実際のところはプロトタイプとなっているので落ち着きましょう。

特に Helios はネイティブ相互運用コードが非常に多くなっているので、まだまだメモリリークやアクセス違反などで急に落ちる可能性は高いです。しかし、将来的には System.Web を完全に殺す力を秘めているので、Web Forms はそろそろ付いていけなくなりそうです。

残念ながら OWIN が使えるメジャーなフレームワークは Web API / SignalR / Nancy ぐらいなので、OWIN と Helios を使ってバリバリ高速アプリ開発するぜ!というのはもう少し時間がかかりそうです。

*1:ぶっちゃけ NDA だと思っていたのに、セッション中に社員がツイートしまくってて焦りました