延迟AppDomain回收文件夹更改

时间:2013-08-05 17:02:15

标签: 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回收?

2 个答案:

答案 0 :(得分:14)

如果您无法延迟AppDomain回收,则可能需要将其禁用。

可以禁用文件更改通知(FCN)行为。

<强>注册表

最初,它是HKLM\Software\Microsoft\ASP.NET\FCNModesetting the value to 1 should disable it的DWORD注册表项。

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

将其放入Global.asax Application_Start。请参阅here

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

至少,您可以使用_dirMonSpecialDirs字段进行游戏,并在StopMonitoring()目录中拨打Bin

.NET Framework 4.5

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

答案 1 :(得分:2)

发现一篇文章解释这个: http://www.ipreferjim.com/2012/04/asp-net-appdomains-and-shadow-copying/

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

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