ASP.NET restarts when a folder is created, renamed or deleted

frankadelic picture frankadelic · Feb 12, 2010 · Viewed 8.3k times · Source

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:

  • Cache is dumped when app domain restarts
  • App domain needs to be re-built after restart

Answer

frankadelic picture frankadelic · Feb 12, 2010

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[] { }); 

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx

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.