FCNsを閉じる(ファイル修正モニタ)
4151 ワード
サイトの特定のファイルとディレクトリを変更すると、サイト全体が再起動または再コンパイルされることを知っているかもしれません.サイトの下にある任意のディレクトリを削除または名前を変更すると、サイト全体が再起動する(ディレクトリを追加することはできません).この問題は実は多くのSessionが失った根源であり、例えば『ASPについてNET 2.0のディレクトリ構造の変化によりセッションが失われる問題』のように、このような例もたくさん見つけることができます.
これは実はASPです.NET 2.0の「丹念」なデザインは、多くの場合にあります.ASP.NETは多くのリソースをキャッシュしますが、ディレクトリの変動を監視していないと、削除されたリソースの一部が使用され、他の不要なリソースが漏洩する可能性があります.この文章では、ディレクトリの削除または名前の変更がサイトの再起動を引き起こす可能性があるいくつかの条件を見つけることができます.
この問題はとっくにASP.NET 2.0が発表されたばかりの頃に発見され、『Deleting ASP.NET 2.0 Application Sub-Directories Shuts Down the AppDomain』について専門的に議論されていたが、本文では解決策も提案されているが、やり方は複雑すぎる.最も理想的な方法は、この問題を解決するために関連するパッチがあり、幸いなことに、ここを通じてこのパッチを見つけることができ、この問題を解決する方法を紹介することができます.
解決策は、ディレクトリの削除または名前の変更を監視するメカニズムを「File Change Notifications(FCNs)」と呼びます.このパッチはFCNSの無効化または有効化を設定するためのスイッチで、FNCSを無効にすればこの問題を回避できます.
作り方:現在のASP.NET 2.0はすでにSP 2に着いているので、このパッチを個別にインストールする必要はありません.この問題は、レジストリで一歩操作するだけで解決できます.HKLMSoftwareMicrosoftASP.NETはFCNmodeという名前のDWORD値を追加し、デフォルトでは存在しないはずです.その値の意味は:
Does not exist This is the default behavior. For each subdirectory, the application will create an object that will monitor the subdirectory.
0 or greater than 2 This is the default behavior. For each subdirectory, the application will create an object that will monitor the subdirectory.
1The application will disable File Change Notifications (FCNs).
2The application will create one object to monitor the main directory. The application will use this object to monitor each subdirectory.
FCNSを無効にするには、値を1に設定します.詳細については、http://support.microsoft.com/kb/911272を参照してください.
レジストリを終了し、IISを再起動すると、問題が解決します.
説明します:Sessionの損失はAppDomainの再起動の副作用にすぎず、本稿の重点ではなく、他の人が関連する問題を検索する際のタイトルの最適化を容易にするためです.また、サイトの再起動の原因はいくつかありますが、上記のリンクを参照してください.ここでは説明しません.
もう一度説明します:もしあなたがFCNsを無効にしたら、あなたがWebを修正しても構いません.configもBINディレクトリも、サイト全体の再起動を引き起こすことはありません.これにより、キャッシュの期限切れなどの新しい問題ももたらされると思います.無効にするかどうかは、自分で選択しましょう.(
また、binディレクトリやwebに影響を与えることなく、コードによってディレクトリの変更監視を除去することができる.configが変更された場合、プログラムの再起動が必要です.
これは実はASPです.NET 2.0の「丹念」なデザインは、多くの場合にあります.ASP.NETは多くのリソースをキャッシュしますが、ディレクトリの変動を監視していないと、削除されたリソースの一部が使用され、他の不要なリソースが漏洩する可能性があります.この文章では、ディレクトリの削除または名前の変更がサイトの再起動を引き起こす可能性があるいくつかの条件を見つけることができます.
この問題はとっくにASP.NET 2.0が発表されたばかりの頃に発見され、『Deleting ASP.NET 2.0 Application Sub-Directories Shuts Down the AppDomain』について専門的に議論されていたが、本文では解決策も提案されているが、やり方は複雑すぎる.最も理想的な方法は、この問題を解決するために関連するパッチがあり、幸いなことに、ここを通じてこのパッチを見つけることができ、この問題を解決する方法を紹介することができます.
解決策は、ディレクトリの削除または名前の変更を監視するメカニズムを「File Change Notifications(FCNs)」と呼びます.このパッチはFCNSの無効化または有効化を設定するためのスイッチで、FNCSを無効にすればこの問題を回避できます.
作り方:現在のASP.NET 2.0はすでにSP 2に着いているので、このパッチを個別にインストールする必要はありません.この問題は、レジストリで一歩操作するだけで解決できます.HKLMSoftwareMicrosoftASP.NETはFCNmodeという名前のDWORD値を追加し、デフォルトでは存在しないはずです.その値の意味は:
Does not exist This is the default behavior. For each subdirectory, the application will create an object that will monitor the subdirectory.
0 or greater than 2 This is the default behavior. For each subdirectory, the application will create an object that will monitor the subdirectory.
1The application will disable File Change Notifications (FCNs).
2The application will create one object to monitor the main directory. The application will use this object to monitor each subdirectory.
FCNSを無効にするには、値を1に設定します.詳細については、http://support.microsoft.com/kb/911272を参照してください.
レジストリを終了し、IISを再起動すると、問題が解決します.
説明します:Sessionの損失はAppDomainの再起動の副作用にすぎず、本稿の重点ではなく、他の人が関連する問題を検索する際のタイトルの最適化を容易にするためです.また、サイトの再起動の原因はいくつかありますが、上記のリンクを参照してください.ここでは説明しません.
もう一度説明します:もしあなたがFCNsを無効にしたら、あなたがWebを修正しても構いません.configもBINディレクトリも、サイト全体の再起動を引き起こすことはありません.これにより、キャッシュの期限切れなどの新しい問題ももたらされると思います.無効にするかどうかは、自分で選択しましょう.(
また、binディレクトリやwebに影響を与えることなく、コードによってディレクトリの変更監視を除去することができる.configが変更された場合、プログラムの再起動が必要です.
public class StopFileMonitorModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { });
}
#endregion
}