6

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

当我在 Visual Studio 中构建项目时,IIS 确实回收了 AppDomain 并加载了新构建的项目,但现在我遇到了问题,它会“快速”执行此操作。
我的页面上有一些脚本,一旦被回收就会触发 App-Startup(比如不断打开 SignalR 通道),所以当我的项目只有一半被构建时,已经创建了一个新的 AppDomain,所以它第二次回收然后实际上崩溃了,因为我PreApplicationStartMethod将一些插件 DLL 复制到了 Shadow-Copy 目录,但是“旧 DLL”仍然被第一个 AppDomain 锁定。
如果我再等 10 秒左右,一切都很好,我的“新 AppDomain”就会启动。
bin文件夹。

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

4

2 回答 2

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

把它放在你的Global.asax Application_Start. 见这里

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

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

.NET 框架 4.5

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

于 2013-08-08T10:56:34.340 回答
2

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

我搜索的设置是waitChangeNotificationmaxWaitChangeNotification作为httpRuntime.

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

于 2013-08-08T06:40:53.533 回答