9

编辑:这以前被命名为“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 编译直接引用的程序集而不是其依赖项?

4

1 回答 1

15

Well the post mentioned in my comment above led me in the right direction and then I found the answer on this post: Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

So my code was changed to var assemblies = BuildManager.GetReferencedAssemblies();

于 2013-09-12T16:03:35.203 回答