App_Offline.htmについて

App_offline.htm(512byte以上)をASP.NETアプリケーションのルートフォルダにおけば、ASP.NETアプリを停止できそうだということが分かったので、公式情報を調べてみた。
MSDN(米国)での検索=結果4件】
Walkthrough: Deploying an ASP.NET Web Application Using XCOPY
What's New in Publishing Web Sites in Visual Studio
Using SQL Server Express Edition with ASP.NET
Using SQL Server Express Edition with ASP.NET (Visual Studio)
MSDN(日本)での検索=結果2件】
チュートリアル : XCOPY を使用した ASP.NET Web アプリケーションの配置
Visual Studio での Web サイトの発行の新機能

ということでほとんど同じような内容。
あんまり細かいことが書いてなかったので、実際にテストしてみる。
疑問に思ったのは、同じアプリケーションプールに割り当てられている他のアプリケーションに影響せずにちゃんとASP.NETアプリが再起動するのか?ということだ。
【テスト内容】
同一アプリケーションプールに割り当てた2つのASP.NETアプリケーション(AとB)。
Appication_Start()ハンドラ内に開始時間を保持[AppStartTime]しaspxで表示させるよう設定

アプリA : AppStartTime=2006/09/21 17:18:19
アプリB : AppStartTime=2006/09/21 17:18:43

W3WP.EXE PID:3160 AppPoolId:test20060720 (iisapp.vbsによる表示)

17:25:04 App_Offline.htmをアプリAのルートに配置
アプリA : App_Offline.htmによるメッセージ表示
アプリB : 継続動作中
17:26:04 App_Offline.htmをアプリAのルートから削除
アプリA : AppStartTime=2006/09/21 17:26:16 (再起動)
アプリB : 継続動作中

ということで、他のアプリケーションプールや同一アプリケーション内の他のアプリケーションドメインに影響することなく再起動させることができるのを確認。
一応これで安心した。
しかし、例外的に次の内容があるので、アンマネージコードやfinallyブロックがなんらかの理由で長時間かかるような場合にはアンロードは保証されない

.NET Framework クラス ライブラリ
AppDomain.Unload メソッド
.NET Framework Version 2.0 では、アプリケーション ドメインをアンロードするための専用のスレッドが使用されます。このバージョンの .NET Framework がホストされた環境では、これによって信頼性が向上します。スレッドから Unload が呼び出されると、ターゲット ドメインがアンロードの対象としてマークされます。専用のスレッドによって、そのドメインのアンロードが試みられ、そのドメインのすべてのスレッドが中止されます。アンマネージ コードを実行中である、または、finally ブロックを実行中である、などの理由からスレッドを終了できなかった場合は、一定時間の経過後に、Unload の呼び出し元スレッドで CannotUnloadAppDomainException がスローされます。最終的にスレッドを終了できなかった場合、ターゲット ドメインはアンロードされません。このように、.NET Framework Version 2.0 では、実行中のスレッドを中止できない場合があるため、domain が確実にアンロードされるという保証はありません。


MEMO(20497)