web.configが変更されたときにASP.NETアプリケーションが再起動するのを防ぐ方法は?
-
03-07-2019 - |
質問
ApplicationHost.CreateApplicationHost
メソッドを介してASP.NETランタイムをホストしています。アプリケーションの実行中に web.config
を変更すると、 ThreadAbortException
が最初にスローされることがよくあります。これは、アプリケーションがクラッシュする直前です。これは、ランタイムが構成の変更を検出し、再起動するためだと考えています。
これは、実際にサポートされているシナリオではないため、自動再読み込みをオフにできるとよいのですが。
これを行う方法を知っている人はいますか
解決
私が知る限り、この動作を無効にする方法はありません。webconfigを変更すると、アプリケーションが強制的に再起動されます。
更新:実際に可能であり、この回答で説明されているように、多くのメソッドがよく文書化されています *
元の答え:
他の参考のために、同様の質問ここがあります。役に立つかもしれない追加情報を見つけました。
から構成の変更により再起動が発生する アプリケーションドメインの
への変更 Web.configの構成設定 ファイルが間接的にアプリケーションを引き起こす 再起動するドメイン。この動作 設計により発生します。オプションで configSource属性を使用して 外部設定ファイルを参照する ときに再起動を引き起こしません 変更が行われます。詳細については、 一般属性のconfigSourceを参照してください。 セクション要素によって継承されます。
* 免責事項:私は他の答えを書きましたが、通常は自己参照しませんが、この投稿の8年後からここにリンクするのに十分な関連性があることがわかりました。 IISフロントエンドをクリックすると、ASP.NET 1.0以降に回避策が存在します。
他のヒント
実際には、最初の2つの答えは間違っています。このリサイクルの発生を防止することは 可能であり、非常に簡単です。この機能は少なくともIIS6以降で利用可能です。
方法1(システム全体)
HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ FCNMode
の DWORD
レジストリ設定を値 1
に変更します。 すべてのファイル変更通知を無効にします。
場所と混同しないでください。 Wow6432Node
は、この場合、Webアプリケーションのビット数に影響しません。
方法2(.NET 4.5 +)
.NET 4.5を使用している場合は、でこれを無効にすることが可能になりました。サイトごとのレベル、単に web.config
で以下を使用します:
<httpRuntime fcnMode="Disabled"/>
方法3(IIS6 +)
最後に、また(少なくとも)IIS6以降、アプリケーションプールのみの設定として、 DisallowRotationOnConfigChange
という設定があります(少なくとも、MSDNのテキストはそうしようとしていますが、テストしていません)それ)。 true
に設定すると、アプリケーションプールの構成を変更しても、すぐにリサイクルされることはありません。
この最後の設定は、アプリケーションプールの詳細設定からも設定できます。
方法4(ASP.NET 1.0および1.1)
ASP.NET 1.0または1.1を使用する(古い)Webサイトの場合、確認済みのバグがありますファイルの変更時に迅速かつ繰り返しリサイクルを引き起こす可能性があります。当時の回避策は、メインの質問で提案された MartinHN に似ていました。つまり、 web.config
:
<compilation
debug="false"
defaultLanguage="vb"
numRecompilesBeforeAppRestart="5000">
これはリサイクルを無効にしませんが、 5000 再コンパイルが行われた後にのみ無効になります。この数値が役立つかどうかは、アプリケーションのサイズによって異なります。 Microsoftは、再コンパイルが実際に何であるかを明確に述べていません。ただし、デフォルトは 15 です。
余談です: .NETまたはWindowsのバージョンに関係なく、アプリケーションを共有から実行し、負荷分散された環境で使用すると、サイトは継続的にリサイクルされます。これを解決する唯一の方法は、その FNCMode
設定をレジストリに追加することでした(ただし、より詳細なオプションが追加されました)。
同じ行でさらに大きな問題に遭遇しました-AppDomainベースディレクトリの any ファイルまたはサブフォルダを変更すると、ホスティング環境がシャットダウンします。同じAppDomainでWPF UIを実行しているため、これはアプリケーションにとって非常に大きな問題であり、ユーザーを混乱させることなく再起動することはできません。
アプリケーションのWebベースの部分に対して個別のAppDomainを実行する必要を避けたいので、Reflectorで掘り下げました。原因は内部クラス FileChangesMonitor
であることがわかりました。
それで、私はこの問題を解決するために恐ろしい恐ろしい反射ハックを書きました。私は、同じ問題を抱えている他の誰かのための潜在的な解決策としてここに投稿すると思いました。ファイル/フォルダの変更でシャットダウンを無効にするには、 HttpInternals.StopFileMonitoring()
を呼び出すだけです。
internal static class HttpInternals
{
private static readonly FieldInfo s_TheRuntime = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static);
private static readonly FieldInfo s_FileChangesMonitor = typeof(HttpRuntime).GetField("_fcm", BindingFlags.NonPublic | BindingFlags.Instance);
private static readonly MethodInfo s_FileChangesMonitorStop = s_FileChangesMonitor.FieldType.GetMethod("Stop", BindingFlags.NonPublic | BindingFlags.Instance);
private static object HttpRuntime
{
get
{
return s_TheRuntime.GetValue(null);
}
}
private static object FileChangesMonitor
{
get
{
return s_FileChangesMonitor.GetValue(HttpRuntime);
}
}
public static void StopFileMonitoring()
{
s_FileChangesMonitorStop.Invoke(FileChangesMonitor, null);
}
}
解決策は、web.configセクションに次の要素を追加することです。
<httpRuntime
waitChangeNotification="315360000"
maxWaitChangeNotification="315360000"
/>
jfburdetが述べたように、解決策はwaitChangeNotificationとmaxWaitChangeNotificationを使用することです。
とはいえ、ASP.NETが混合モードで実行されている場合、IIS 7では動作しないことを知っておく必要があります。 http://forums.iis.net/t/1149344.aspx