我正在开发一个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.看到这里.
如果要禁用对可以使用的特定路径或文件StopMonitoringFile或StopMonitoringPath方法的监视FileChangesMonitor.但是,Bin目录是一个特殊的目录,可能不受这两种方法的影响.
至少,您可以使用该_dirMonSpecialDirs字段并调用StopMonitoring()您的Bin目录.
.NET Framework 4.5
在.NET Framework 4.5中,存在HttpRuntimeSection.FcnMode属性.关于它的文档并不多,但你可以使用<httpRuntime fcnMode="Disabled"/>.
找到一篇文章解释这一点: http://www.ipreferjim.com/2012/04/asp-net-appdomains-and-shadow-copying/
我搜索的设置是waitChangeNotification和maxWaitChangeNotification作为 的属性httpRuntime。
可悲的是,它似乎没有解决我的问题 - 需要调查更多......
| 归档时间: |
|
| 查看次数: |
3118 次 |
| 最近记录: |