はじめに
自社開発ASP.NETアプリケーションの社外レビューの準備をしようとしたら、下記エラーで動かなくなりました。
HTTP エラー 500.0 - Internal Server Error
ISAPI フィルター "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" での LoadLibraryEx の呼び出しに失敗しました。
最近まで問題なく動作していたはずなのに何があったんだろう、そういえば同僚がWindowsパッチの検証をしていたことを思い出しました。
なんとかしないことには社外レビューが出来ません。
調査
同じIISを使用している他サイトのアプリケーションではエラーがなくて動作しています。
サイト上のASP.NETが悪さしているのかと思い、単純なHTMLページを作成してみたのですが同じエラーになります。
エラー名で検索すると下記サイトが見つかりました。
IISマネージャーの「アプリケーションプールの既定値」にある「32bitアプリケーションの有効化」を
「True」に変更したところ、エラーが消え、ページが表示されるようになりました。
- IIS7.5のエラー Microsoft.NET Framework v4.0.30319 aspnet_filter.dll
- Calling LoadLibraryEx on ISAPI filter failed (v4.0.30319)
この通りに「アプリケーションプールの既定値」にある「32bitアプリケーションの有効化」を「True」に変更したら、確かにエラーなく動作するようになりました。確かに他サイトのアプリケーションではClassic ASPを動かす仕組み上「32bitアプリケーションの有効化」を「True」にしていました。
しかし、今回のASP.NETアプリケーションは64bitのまま動作させたいので、もう少し原因を追求することにしました。
ISAPI フィルター
IISの機能を追加する際に「ISAPI フィルター」にチェックを付けたものの、今回調査するまで何に使うのか理解していませんでした。
ISAPI フィルタは IIS の内部処理を横取りしてIISをカスタマイズすることを可能とするための API です。
HTTP 圧縮 ・ SSL 等の機能は ISAPI フィルタで実装されている
現在のIISの「ISAPI フィルター」は下記のようになっていました。
同じ構成の別サーバーのIISの「ISAPI フィルター」は下記のようになっていました。
おやおや、登録数が違いますね。
原因
なぜ、aspnet_filter.dllのLoadLibraryExの呼び出しに失敗したのか、「32bitアプリケーションの有効化」を「True」に変更したら動作するようになったのか理由が分かりました。
Windowsパッチを当てたのが原因かが不明ですが、「ISAPI フィルター」の登録内容が書き変わってしまったことだけは確かです。ASP.NET 4の32bit版のISAPI フィルターのみが登録されていたので32bitを有効化すれば動作し、64bit版は未登録なのでLoadLibraryExの呼び出しに失敗するわけです。
後日、別サーバーに対象のWindowsパッチを幾つか当ててみたのですが「ISAPI フィルター」の登録内容は書き変わらなかったです。ただ今回のサーバーは、Windowsパッチを当てる上で色々なことを試してみたりしたようなので何かが悪さしたんでしょうね。
対応
理論的に64bit版のISAPI フィルターを登録すれば動作するはずです。それではと登録してIIS再起動してみると、残念ながら同じエラーになります。なんでやねん。
困ったと思いながら、ISAPI フィルターを一旦全部削除してみたら動作しました。
それではと64bit版のISAPI フィルターを登録し直すと動作しました。さらに32bit版のISAPI フィルターを登録し直すと動作しました。
きっと中途半端に「ISAPI フィルター」の登録内容が書き変わってしまったんでしょう。全部削除して作り直したことで正常な状態に戻ったようです。
最後に
以前に導入作業で休日出勤していた際、IISのWebサイトがエラーで何も表示されなくなってしまい、設定を何度見直して何もおかしくないしログを見ても分からず、時間ばかりが経っていく状態で退社時間も迫ってきて困りはてて当時の上長に電話で相談したところ、「仮想ディレクトリを削除して作り直してみて」とのアドバイスをもらい、試したところ正常に表示されるようになりました。
教訓
IISがおかしくなったら、設定が正しくても削除して作り直すといいでしょう。