当应用程序池被回收时,Blazor 服务器端应用程序是否真正启动?

Does a Blazor server-side app actually start when its application pool gets recycled?

我有一个带有定时托管服务的 Blazor 服务器端应用程序(使用计时器实现 IHostedService)。该应用程序托管在 IIS 中,并有自己的应用程序池,每天回收一个。

我注意到在池被回收后,我的定时托管服务没有启动(我正在记录事件),即使应用程序实际上是 运行。一旦我第一次访问该应用程序,该服务就会按预期启动。

这是 Blazor 服务器端应用程序的正常行为吗?

马克·德博诺,

IIS会定期回收,类似于自动重启网站。网站启动后的第一次访问往往很慢。网站启动后,没有访问。一段时间后,IIS会被回收。再次请求时,会和刚启动网站时一样。需要稍等,这是IIS回收造成的

除上述情况外,定时回收还会回收托管的后台任务,导致后台任务终止执行,直到一个请求(网站任意地址)任务启动,那么如果请求没有来时间长了,任务就无法被激活,错过了任务应该执行的阶段。虽然可以调整自动回收的时间,甚至设置为不自动回收,但这都不是最好的解决办法。

我觉得下面的方案比较好:通过配置IIS实现预加载,即在资源回收的时候,通过一个link唤醒,这样第一次访问就不会觉得卡了,而且被回收的定时任务会再次重启。具体配置方法如下:

  1. Select 站点并在高级设置中启用预加载选项。

  2. 在配置编辑器中,select system.webServer/applicationInitialization 部分,将 doAppInitAfterRestart 选项设置为 true 并添加一个集合项。

  3. 设置应用程序池启动模式为:AlwaysRunning

当然,为了保险起见,在设置定时任务的时候一定要注意它的操作,以免造成不必要的麻烦。最好记录一个日志,晚上闲着回收的时候注意网站的运行情况,保证稳定。如果你的任务还是有Exception,那么最好写一个服务给运行个定时任务