当我在虚拟目录中创建临时文件时,IIS应用程序池崩溃

时间:2010-08-25 18:48:09

标签: asp.net iis

我有静态内容,如html,存储在DB中的css javascript。当用户请求这些时,我在虚拟目录中创建一个临时文件并返回该URL。

我的网络应用程序托管在IIS服务器上。在某些系统上创建文件时,我的IIS应用程序池崩溃并重新启动。如果我禁用文件监控虽然问题得到了解决,但是当我在客户端部署时,我没有这种奢侈。

在文件创建过程中,有什么方法可以避免应用程序池崩溃吗?

如果没有,我可以通过哪种方式提供静态内容,如html,css,images,xml和js,而无需创建临时文件。我需要一种处理所有这些数据类型的通用方法。

1 个答案:

答案 0 :(得分:1)

找到一个代码片段,该代码片段在应用程序启动事件中执行,禁用根Web文件夹上的文件更改通知

System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);

object o = p.GetValue(null, null);

System.Reflection.FieldInfo f = o.GetType().GetField("_dirMonSubdirs", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.IgnoreCase);

object monitor = f.GetValue(o); //Returns NULL

System.Reflection.MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); m.Invoke(monitor, new object[] { });

另一个有轻微变化的代码

var theRuntime = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
var fcmField = typeof(HttpRuntime).GetField("_fcm", BindingFlags.NonPublic | BindingFlags.Instance);

var fcm = fcmField.GetValue(theRuntime);
fcmField.FieldType.GetMethod("Stop", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(fcm, null);

在这两种情况下,脚本都需要 admin privilages 才能成功运行(尝试使用来宾帐户并失败)