也许你知道,修改站点的某些特定文件和目录会导致整个站点重启或者重新编译。也许你不注意,你不会知道删除或重命名站点下的任意目录,会导致整个站点重启(添加目录并不会)。这个问题其实是很多Session丢失的根源,比如《关于ASP.NET 2.0的目录结构变化导致Session丢失的问题》,同样你还可以找到很多这样的例子。
这个其实是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已经到了SP2,我们不需要单独去安装这个补丁。我们只需要在注册表在做一步操作即可解决这个问题。在HKLM\Software\Microsoft\ASP.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.1
The application will disable File Change Notifications (FCNs).2
The application will create one object to monitor the main directory. The application will use this object to monitor each subdirectory.
我们将它的值设为1即可禁用FCNS。更为详细的可以参考:http://support.microsoft.com/kb/911272
退出注册表,重启IIS,问题即可解决。