EDIT:以前的标题是“IIS 重新启动和应用程序初始化之间的应用程序初始化行为不同”。我更改了标题以将问题从 IIS/应用程序初始化中扩展出来,因为观察到的行为与AppDomain.CurrentDomain.GetAssemblies();
我正在使用 IIS 应用程序初始化模块来预热 asmx wed 服务。
我已经实现了一些预热代码,以确保应用程序应用程序初始化成功 JIT 是 Global.asax Application_Start 事件中的我的 asmx 服务。这使用 System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod() 迭代应用程序中的所有程序集(它还获取所有程序集依赖项),以确保对服务的首次调用尽可能快。
当我利用“net stop w3svc & net start w3svc”观察此行为时,我可以看到(通过日志记录)所有程序集都是 JIT 的,并且对服务的第一次调用如预期的那样快。
但是,当应用程序池按照其配置的时间计划 (03:00:00) 自动回收时,日志显示仅直接引用的程序集经过 JIT,而不是文件夹中的依赖项。
这会导致首次调用服务时产生不可接受的开销。
App Init 在所有其他方面都完全符合预期,但为什么应用程序池的 IIS 回收仅 JIT 编译直接引用的程序集而不是其依赖项?
好吧,我上面的评论中提到的帖子引导我走向正确的方向,然后我在这篇文章中找到了答案:AppDomain.GetAssemblies 和 BuildManager.GetReferencedAssemblies 之间的区别
所以我的代码改为var assemblies = BuildManager.GetReferencedAssemblies();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)