IIS网站文件结构修改导致服务器重启的解决办法
2012-03-15 14:15
531 查看
“/”应用程序中的服务器错误。 正在中止线程。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Threading.ThreadAbortException: 正在中止线程。 源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 堆栈跟踪: [ThreadAbortException: 正在中止线程。] System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +303 System.Web.ApplicationStepManager.ResumeSteps(Exception error) +762 System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +211 System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +452 |
言归正传,由于出错的时间点是2分钟,和这位外国朋友一样,我马上被误导到“Timeout”设置。于是,我把文件上传、页面处理、IIS请求超时、会话超时等多处设置都改成了好几十分钟。错误照旧。直到看了这个网页以后才发现,事情根本不是这样的。
问题的起因是IIS有一个“File Change Notifications(FCNs)”,ASP 2.0所谓“更安全、更稳定”的新特性,它是用来监视Web站点目录下的文件结构或内容“是否被大量改变”。如果站点被改变,则自动重启站点。这个特性主要考虑到,ASP.NET会缓存很多资源,而如果没有监控目录的变动的话,那么有些已删除的资源就有可能仍然被使用着,造成其它不必要的资源泄露。
我立刻联想到先前也出过且一直没解决的一个问题:删除或重命名站点下的任意目录或XML文件会导致丢失Session,从Global.asax(据说是一个很糟糕的设计,但我觉得还OK,长处短处是并存的。)的运行日志看出,Web程序经常莫名其妙重启。在Visual Studio 2008调试时使用的自带轻量级Web服务器不会有这些问题。问题就在这里。
了解事件的起因,我们来谈一谈解决之道。直观的思路就是把FCNs禁用。估计微软后来也意识到了FCNs并非只有好处没有坏处,所以发布了一个ASP.NET 2.0 SP2,提供禁用FCNs功能。然后你有三种途径:
(1)修改注册表
在HKLM\Software\Microsoft\ASP.NET下添加一个名为:FCNMode的DWORD值,默认它应该是不存在的,它的值含义为:
不存在,或不等于1且不等于2:这是默认行为。对每一个子目录,应用程序会创建一个对象监视这个目录。
值为1:应用程序将禁用FCNs。
值为2:应用程序将创建一个对象监视主目录,应用程序用这个对象监视每个子目录。
显然,FCNMode的值设为1即可禁用FCNS。最后,重启IIS。
(2)修改代码
在Global.asax(或其.cs文件)增加代码如下,就可以关掉FCNs)。
using System.Reflection; 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[] { }); |
(3)良好的编程习惯
把经常修改的目录移到外面去,并做一个页面用于下载该文件夹下的文件,可以提高安全性。例如管理信息系统的“用户目录”等。这个方法的优点是,可以避免不必要的资源泄露。
相关文章推荐
- IIS网站文件结构修改导致服务器重启的解决办法
- 通过IIS操作修改服务器文件没有权限的解决办法
- IIS服务器修改文件提示权限不足的解决办法
- 手动修改spfile.ora文件导致oracle启动不了的解决办法
- 修改.bashrc文件错误导致root无法登录的解决办法
- dedecms织梦网站本地迁移到服务器后,后台更新栏目文档提示模板文件不存在,无法解析文档!的解决办法
- 提交代码到svn时服务器重启导致svn无法更新问题解决办法
- Windows IIS服务器.7z文件不能下载解决办法(转载)
- Eclipse解决每次修改java代码或jsp代码服务器重启问题的解决办法
- IntelliJ IDEA 怎么热部署,每次修改java文件就得重启tomcat的解决办法
- 网站发布以后频繁不能访问,需要重启IIS服务才能正常工作的解决办法
- 每次重启Tomcat后,使用Hibernate修改数据库的记录都会导致以前记录被删除的解决办法。
- “MIME”IIS服务器不能发布未知类型文件的解决办法
- 服务器被挂Iframe木马的解决方法(不是IIS映射修改,也不是ARP病毒,并且网页文件源代码里没有iframe代码的解决方法)
- 解决eclipse+tomcat开发时候修改配置文件自动重启服务器问题
- 【VS开发】VS2015没修改源文件也导致重新编译的解决办法
- Destoon5出现 请检查网站根目录下 license.txt 文件是否存在或被修改 终极解决办法
- 提交代码到svn时服务器重启导致svn无法更新问题解决办法
- SVN忽略.so、.dll文件导致没有提交到服务器的解决办法
- Ubuntu由于修改etc/profile文件导致开机无法登陆问题解决办法(仅供参考)