编辑:此前称为“IIS重启和应用程序初始化之间的App Init行为不同”。我已经更改了标题,以便从IIS /应用程序初始化中扩展问题,因为观察到的行为与AppDomain.CurrentDomain.GetAssemblies();
我正在使用IIS应用程序初始化模块来预热asmx婚礼服务。
我已经实现了一些预热代码,以确保应用程序应用程序初始化成功JIT是我在Global.asax Application_Start事件中的asmx服务。这使用System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod()来遍历应用程序中的所有程序集(它还会获取所有程序集依赖项),以确保第一次调用服务的速度尽可能快。 / p>
当我使用“net stop w3svc& net start w3svc”来观察这种行为时,我可以看到(通过记录)所有程序集都是JIT,并且第一次调用服务的速度很快。
但是,当应用程序池在其配置的时间表(03:00:00)上自动回收时,日志仅显示直接引用的程序集是JIT,而不是也位于文件夹中的依赖项。
这导致第一次调用服务时产生了不可接受的开销。
App Init在所有其他方面完全按预期执行,但为什么IIS重新循环应用程序池只有JIT编译直接引用的程序集而不是它的依赖项?
答案 0 :(得分:14)
上面评论中提到的帖子让我朝着正确的方向前进,然后我在这篇文章中找到了答案:Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies
所以我的代码已更改为var assemblies = BuildManager.GetReferencedAssemblies();