アプリケーション内から web.config に触れる以外に、asp.net アプリケーションをバウンスするための推奨される方法はありますか? ですHttpRuntime.UnloadAppDomain()
。これを行うための好ましい方法は?もしそうなら、どこでこれをしますか?ページまたはアプリケーションの他の場所のアンロードで?
7 に答える
アプリケーション内から web.config に触れるのは悪い考えです、IMO。また、変更するファイルを持つという考えは、ちょっとしたハックニー、IMO です。
ドキュメントにUnloadAppDomain
は、アプリケーションをシャットダウンすることが具体的に記載されています。
UnloadAppDomain を使用すると、未使用のアプリケーションをプログラムでシャットダウンできます。
この呼び出しは、アプリケーションのどこでも実行できる必要があります。を取得する可能性があるSecurityException
ため、ランタイムが適切なアクセス許可を与えることを確認してください (これをライブラリに入れて呼び出しを行い、完全な信頼を与えるための証拠を使用してライブラリを GAC にセットアップすることをお勧めします)。 .
これが .NET 2.0 以降の場合は、「App_offline.htm」ファイルを追加し、サーバーに要求を行い、それを削除してから、サーバーに別の要求を行うことができます。
この一連のイベントにより、フォルダーに app_offline.htm ファイルが存在する限り、ASP.NET はアプリケーションを強制的にアンロードします。
Scott Guthrie のブログ エントリ: http://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspx
このコードは私のために働きます。アプリケーションをリロードするために呼び出すだけです。
System.Web.HttpRuntime.UnloadAppDomain();
このメソッドは、アプリケーションをアンロードするだけです。このメソッドを ASP.NET Web ボタンに配置するだけで、完全に完了です。では、いつアプリケーションがリロードされるのでしょうか? 実際にボタンをクリックすると、まずメソッドが起動され、アプリケーションがアンロードされます。ボタンをクリックしただけで Web ページが更新されるため、その時点で表示している Web ページも再読み込みされます。メソッドを起動した後、ページの更新プロセスにより、アプリケーションも再読み込みされます。
アプリに関連付けられているアプリケーション プールを停止および開始することもできます。
これを行うには、HttpRuntime.ShutdownAppDomainメソッドを呼び出します (これは非公開の静的メソッドであるため、リフレクションを使用して呼び出す必要があります)。
「再起動」REST API でこのメソッドを使用する方法の例については、IIS ワーカー プロセスをプログラムで再起動する方法 (つまり、現在の ASP.NET ドメインをシャットダウンする)を参照してください。
実行時にアプリケーション ディレクトリの下にフォルダーを作成するか名前を変更することで、Web アプリケーションを安全に再起動できます。明らかに、アプリケーションを実行するために割り当てられたユーザーに、Web ディレクトリまたはその下のサブディレクトリに対する「変更」権限を付与する必要があります。
この方法は http://www.bartlannoeye.be/blog/restarting-a-.net-web-application-without-restarting-iisで言及されています
私の場合、次のコードを使用してそれを行いました。「書き込み可能な」サブディレクトリで動作するように変更します
protected void RestartButton_Click(object sender, EventArgs e)
{
//restart web app (instead of iisreset)
DirectoryInfo dir = new DirectoryInfo(Server.MapPath("restart"));
if (dir.Exists)
{
Directory.Move(dir.FullName, dir.FullName + "ed");
}
else
{
DirectoryInfo dired = new DirectoryInfo(Server.MapPath("restarted"));
if (dired.Exists)
{
Directory.Move(dired.FullName, dir.FullName);
}
else
{
Directory.CreateDirectory(dir.FullName);
}
}
}
アプリ プールを停止および開始したくない場合は、いつでもリサイクルできます。