.NET Core 部署IIS无法启动Hangfire方案
【导读】不知道是否有童鞋遇到过将.NET Core部署到IIS上时,但Hangfire无法启动,自然而然也就导致作业无法良好运行的问题,本文给出两个方案,不知是否有完美解决方案,若有,请于留言中给出,谢谢。
Hangfire部署IIS
相信有一部分童鞋在.NET Core上利用Hangfire来进行作业计划,无论是一触即发,还是延迟,抑或是周期Hangfire都能很好的支持,但是若将Hangfire应用于实际生产环境时,我们会发现存在很多问题,这些问题只有实践过后才能体会到各种坑,但更深入的资料网上并没有,只能靠经验或依托源码摸索。
配置什么的就不过多废话,我们实现一个很简单的Hangfire周期作业,然后将一段字符串输入到文本上,如下周期作业:
RecurringJob.AddOrUpdate(
() => File.WriteAllLines(Path.Combine(AppContext.BaseDirectory, "hangfire-demo.txt"), new[] { "Recurring" }),
Cron.Minutely());
要将.NET Core寄宿在IIS运行除了安装必须的runtime外,还需安装对应版本的host-bundle模块,这里以.NET Core 3.1为例,所以安装名为【dotnet-hosting-3.1.0-win】的host-bundle,至于原因请自行察看官方文档
紧接着我们打开IIS,创建.NET Core的无托管应用程序池,继而创建网站,如下图所示
然后我们就等啊等,等到花儿都快谢了,最终我们会发现过了几分钟后然鹅并没有在如下图文本中输出字符串,你说气人不
IIS启动Hangfire方案
首先我们在web.config里打开.NET Core默认日志输出,将该属性设置为ture即可,如下图所示
然后手动访问下网站,接下来我们就可以看到日志文件
请客官稍等片刻,紧接着就启动了Hangfire后台服务并输出了字符串到文件中
就是这样,必须手动访问下网站才能在IIS上启动Hangfire,Hangfire本就作为后台作业服务去启动业务作业,现在反过来还得手动鞭策一下才能启动,有意思。
那么究竟是什么原因导致必须手动访问网站才能启动Hangfire呢?
那我们是否可以理解为网站的启动并不会使.NET Core程序启动,换言之也就是不会执行startup,只有第一次访问时才会执行呢?
那么我们是否通过什么方式使得网站启动时,程序也进行了执行(即执行startup呢)
唯一能想到的则是.NET Core应用程序池,所以接下来我们尝试,当我们发布程序到IIS时首先将.NET Core应用程序池停止,创建完网站后再将该程序池启动,如下:
此时我们将发现在启用了.NET Core默认文件日志输出后,将会自动如上生成日志文件,从而很好的启用了Hangire后台作业服务。
综上所述在IIS上想要启动Hangfire作业服务,要么手动访问下网站,要么在网站启动后再启动.NET Core无托管应用程序池。
以上纯属我个人的猜测和分析,若有错误之处,还请批评指正,谢谢。