延迟AppDomain回收文件夹更改

Chr*_*Fin 6 asp.net iis iis-7

我正在开发一个ASP.NET 4应用程序并在开发过程中也使用完整的IIS(出于几个原因;我使用多个域指向应用程序).

当我在Visual Studio中构建项目时,IIS确实回收了AppDomain并加载了新构建的项目,但现在我遇到了问题,即它"快速".
我的页面上有一些脚本,一旦它被回收就会触发App-Startup(就像不断打开的SignalR通道一样),所以当我的项目只有一半被构建时,已经创建了一个新的AppDomain,所以它再循环一次然后实际崩溃,因为我有PreApplicationStartMethod一些Plugin-DLL复制到Shadow-Copy目录,但"旧DLL"仍然被第一个AppDomain锁定.
如果我等待〜10s一切都很好,我的"新AppDomain"启动.
我只是通过简单地告诉IIS等待几秒钟来解决这个问题,这样构建就可以在检测到bin文件夹中的更改后完成.

所以我的主要问题:
是否有可能延迟IIS下的AppDomain回收?

Joe*_*lly 14

如果您无法延迟AppDomain回收,则可能需要禁用它.

存在可以禁用的文件更改通知(FCN)行为.

注册处

最初,它是一个DWORD注册表项HKLM\Software\Microsoft\ASP.NET\FCNMode,将值设置为1应禁用它.

代码(hack)直到.NET Framework 4.0

这个hack可能适用于2.0-3.5和4.0框架.

//Disable AppDomain restart on file change

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

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

System.Reflection.MethodInfo m = fcm.GetType().GetMethod("Stop",
    System.Reflection.BindingFlags.Instance 
    | System.Reflection.BindingFlags.NonPublic); 
m.Invoke(fcm, new object[] { }); 
Run Code Online (Sandbox Code Playgroud)

放在你的Global.asax Application_Start.看到这里.

如果要禁用对可以使用的特定路径或文件StopMonitoringFileStopMonitoringPath方法的监视FileChangesMonitor.但是,Bin目录是一个特殊的目录,可能不受这两种方法的影响.

至少,您可以使用该_dirMonSpecialDirs字段并调用StopMonitoring()您的Bin目录.

.NET Framework 4.5

在.NET Framework 4.5中,存在HttpRuntimeSection.FcnMode属性.关于它的文档并不多,但你可以使用<httpRuntime fcnMode="Disabled"/>.

  • 我可以确认<httpRuntime fcnMode ="Disabled"/>在4.5中工作.谢谢! (4认同)

Chr*_*Fin 2

找到一篇文章解释这一点: http://www.ipreferjim.com/2012/04/asp-net-appdomains-and-shadow-copying/

我搜索的设置是waitChangeNotificationmaxWaitChangeNotification作为 的属性httpRuntime

可悲的是,它似乎没有解决我的问题 - 需要调查更多......