UPDATE -- process to replicate issue:
1) Create a website project at c:\projects\restart-demo
2) Add default web.config and a dummy aspx page test.aspx
3) Map IIS to point to the root folder c:\projects\restart-demo
4) Monitor application restarts using perfmon, health monitoring, tracking in global.asax Application_End, etc.
5) Request page in browser http://localhost/test.aspx
application start
6) Create new folder c:\projects\restart-demo\asdf
application end
7) Request page in browser http://localhost/test.aspx
application start
8) Rename folder c:\projects\restart-demo\asdf to c:\projects\restart-demo\asdf1
application end
end update
We are using a back-end CMS to generate files and folders in an ASP.NET site.
Users are able to create/modify/delete files and push these out to the web farm.
One problem we have noticed:
When the user creates, renames or deletes a folder, it causes the App Domain to restart. As a consequence, session, cache, etc. are all lost.
Note it doesn't need to be a special folder like /bin or /App_Code either.
Is there any way to prevent this behavior?
It is really hampering performance for two reasons:
This code appears to resolve the issue, when added to Application_Start() in Global.asax:
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[] { });
With these changes, I can create/modify/delete folders without causing the application to restart.
Not clear if this is the best solution -- Don't know if there will be unwanted side effects due to calling StopMonitoring.