最终目标是,每当我的应用程序池被回收时(每次我发布网站更新时都会发生这种情况),我的网站都会被访问一次以“预热”。通常,回收后的第一次访问需要 2.5 秒,然后后续访问只需要 0.5 秒,因此每次更新后都需要访问一次。我想自动执行此操作,看来 Windows 应用程序初始化功能是实现此目的的方法。
问题是,启用此功能后,重新启动应用程序池(或重新启动任何程序)时,我看不到任何访问我网站的访问日志。似乎应用程序初始化功能根本不起作用。我没有在系统事件日志中看到任何错误,也没有看到任何进一步排除故障的方法。
环境如下:
- Windows 服务器 2019
- IIS 10(具有所有需要的角色/功能)
- ASP.NET Core 3.1
以下是我配置的内容(使用IIS 8.0 应用程序初始化指导):
- Windows 中已安装“应用程序初始化”功能/角色
- 应用程序池:
- .NET CLR 版本:无托管代码(我也尝试过 v4.0)
- 托管管道模式:集成
- 立即启动应用程序池:已启用
- 启动模式:AlwaysRunning
- 空闲超时(分钟):0
- 常规时间间隔(分钟):0
- 地点:
- 仅 HTTPS(我也尝试过添加 HTTP)
- 已启用预加载:True
- applicationHost.conf 文件
system.webServer/applicationInitialization
部分:
故障排除:
- 我已重新启动站点/应用程序池/服务/服务器
- 我已经尝试了该
system.webServer/applicationInitialization
部分中的各种设置,并将其移动到 web.config - 我注意到
globalModules
applicationHost.config 文件的部分中有这个,但我浏览到该文件夹时发现它是空的。我本以为里面会有一些 dll 文件,包括 warmup.dll:
<add name="ApplicationInitializationModule" image="%windir%\System32\inetsrv\warmup.dll" />
答案1
如果您的网站使用数据库,则可能存在问题,大多数情况下仅在第一次请求时才建立与数据库的连接,那时也会进行数据库版本检查,如果需要一段时间,您可以执行此操作,检查回收后连接是否仍然处于活动状态,如果不处于活动状态,请使其从池启动,这应该会有所帮助。
(自动翻译,请忽略拼写错误)
答案2
似乎 IIS 应用程序初始化功能和 ASP.NET Core 3.1 站点之间一定存在一些不兼容性,因为它根本不起作用,而且似乎没有任何方法可以排除故障。
因此,我决定完全放弃 IIS 进程内托管,转而托管 Kestrel在 Windows Service Worker 服务内部。