しばやん雑記

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

ASP.NET Core が HttpPlatformHandler から専用の IIS モジュールに移行する理由

ASP.NET Core は元々 Helios で動かす予定だったのが、サーバーが Kestrel への 1 本化に伴い IIS 向けには HttpPlatformHandler が採用されてきましたが、少し前に HttpPlatformHandler から fork した ASP.NET Core Module が使われることになりました。

公式からアナウンスと移行する理由が発表されています。

ざっくりと説明すると、HttpPlatformHandler は ASP.NET Core 専用ではなく、Java や Ruby などを動作させるための汎用的なリバースプロキシですが、最近は ASP.NET Core に必要な機能が実装される流れでした。

汎用的なモジュールである HttpPlatformHandler に専用の機能を入れるのではなく、新しいモジュールを作って専用の機能を入れるべきという話になり、作られたのが ASP.NET Core Module というわけです。

既に Web Apps にはインストールされているので、Web.config を修正すれば使えるようになっています。

App_Offline.htm 対応

ぶっちゃけ、この機能を知らなかったんですが App_Offline.htm というファイルを置くと、アプリケーションが止まるようになっているみたいです。

[ASP.NET]Webアプリケーションを一時的に停止するには?[2.0のみ] - @IT

ASP.NET の機能のようですが、今後使うことがあるのかはちょっとわかりません。

クライアント証明書のフォワーディング

ARR やそれを利用している Web Apps には近い機能が実装されていますが、ASP.NET Core Module と HttpPlatformHandler にも実装されるようです。

仕様はわかりませんが、HTTP ヘッダーで Base64 な証明書を渡してくるのでしょう。

system.webServer/handlers のロック解除

最初は何を言っているんだという感じでしたが、どうやら ASP.NET 4 をインストールしていない IIS は該当のセクションが何故かロックされていて、Web.config からの書き換えが出来ないらしいです。

これはインストーラーでの対応なのかなと思います。

仮想ディレクトリ対応

これまでに試したことはなかったのですが、HttpPlatformHandler はアプリケーションのルートでしか動作しないようです。冷静になって考えると、ルーティングは下で動くアプリケーションに依存するので、気にしなくても良かったのですね。

しかし ASP.NET ではサブディレクトリに別のアプリケーションをデプロイ出来るので、そういった用途向けへの対応だと思います。仮想ディレクトリ名を環境変数で渡す形みたいです。

HttpPlatformHandler の話

ASP.NET Core の開発に伴って発見されたバグは、今後公開される予定の HttpPlatformHandler v1.3? にも反映される予定になっているようです。内容は Issue に追加されています

Issues · aspnet/IISIntegration · GitHub

中でも大きいものは、エスケープ解除がされてフォワーディングされてしまう問題かなと思います。

HttpPlatformHandler v1.3? がどのタイミングでリリースされるのかは不明ですが、ASP.NET Core Module が GA するまでには出るのではないかと。