最终目标是让每当我的应用程序池被回收(每当我发布网站更新时都会发生这种情况),我的网站会被访问一次以“预热”。通常,循环后的第一次访问需要 2.5 秒,然后后续访问只需要 0.5 秒,因此每次更新后都需要访问一次。我想自动化它,似乎 Windows 应用程序初始化功能就是这样做的方法。
问题是,启用此功能后,在重新启动应用程序池(或重新启动任何东西)后,我看不到任何访问我网站的访问日志。似乎应用程序初始化功能根本不起作用。我在系统事件日志中看不到任何错误或任何进一步排除故障的方法。
下面是环境:
- 视窗服务器 2019
- IIS 10(具有所有需要的角色/功能)
- ASP.NET 核心 3.1
这是我配置的内容(使用IIS 8.0 应用程序初始化指南):
- “应用程序初始化”功能/角色已安装在 Windows 中
- 应用程序池:
- .NET CLR 版本:无托管代码(我也尝试过 v4.0)
- 托管管道模式:集成
- 立即启动应用程序池:已启用
- 启动模式:AlwaysRunning
- 空闲超时(分钟):0
- 常规时间间隔(分钟):0
- 地点:
- 仅 HTTPS(我也尝试过添加 HTTP)
- 启用预加载:真
- 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" />
如果您的网站使用数据库,则可能存在问题,大多数情况下仅在第一次请求时才建立与数据库的连接,此时也会进行数据库版本检查,如果需要同时,在回收后检查连接是否仍然处于活动状态,如果它不处于活动状态,则使其从池开始,这应该会有所帮助。
(自动翻译,请忽略拼写错误)
似乎 IIS 应用程序初始化功能和 ASP.NET Core 3.1 站点之间一定存在一些不兼容,因为它根本不起作用,而且似乎没有任何故障排除方法。
因此,我决定完全放弃 IIS 进程内托管,而是将 Kestrel 托管在 Windows Service Worker Service中。