我正在开发一个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回收?
答案 0 :(得分:14)
如果您无法延迟AppDomain回收,则可能需要将其禁用。
可以禁用文件更改通知(FCN)行为。
<强>注册表强>
最初,它是HKLM\Software\Microsoft\ASP.NET\FCNMode
,setting 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
中的StopMonitoringFile
或StopMonitoringPath
方法。但是,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/
我搜索的设置为waitChangeNotification
和maxWaitChangeNotification
作为httpRuntime
的属性。
可悲的是,它似乎没有解决我的问题 - 需要调查更多......