.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无托管应用程序池。

以上纯属我个人的猜测和分析,若有错误之处,还请批评指正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。关于 Hangfire、MySQL 和 ASP.NET Core 3.1 的使用,我可以给出一些异常解决的建议。 首先,确保你已经按照官方文档正确地安装和配置了 Hangfire 和 MySQL。然后,根据你遇到的异常,尝试以下解决方法: 1. "Could not load file or assembly 'MySql.Data' or one of its dependencies" 异常 这个异常通常是由于缺少 MySQL 数据库驱动程序引起的。你需要在项目中添加对 MySQL 数据库驱动程序的引用。可以通过 NuGet 包管理器来安装 MySQL.Data。 2. "Specified key was too long; max key length is 767 bytes" 异常 这个异常是由于 MySQL 的索引长度限制引起的。解决方法是,在你的 DbContext 类中覆盖 OnModelCreating 方法,将所有字符串属性的最大长度设置为 255。 ``` protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var property in modelBuilder.Model.GetEntityTypes() .SelectMany(t => t.GetProperties()) .Where(p => p.ClrType == typeof(string))) { property.SetMaxLength(255); } } ``` 3. "MySqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding" 异常 这个异常通常是由于 MySQL 连接超时引起的。解决方法是,在连接字符串中添加 Connection Timeout 参数,例如: ``` "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Connection Timeout=60;" ``` 这将使连接超时时间为 60 秒。 希望这些解决方法能帮助你解决异常问题。如果你还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值