7.2 ABP后台服务 - 集成Hangfire

7.2.1 简介

Hangfire是一个综合性的后台作业管理工具。你可以用Hangfire来替换ABP中默认实现的后台作业管理者。你可以对Hangfire使用相同的后台作业API。因此,你的代码将独立于Hangfire。但是,如果你喜欢,你也可以直接的使用 Hangfire 的API。

Hangfire的集成依赖于你所使用的框架。

7.2.2 ASP.NET Core集成

基于ASP.NET Core的应用程序,我们需要引用Abp.HangFire.AspNetCore包。它依赖于 Hangfire.AspNetCore。这个文档说明了安装hangfire到ASP.NET Core项目。它类似基于ABP的项目。首先需要在web项目中安装Abp.HangFire.AspNetCore

  1. Install-Package Abp.HangFire.AspNetCore

对于Hangfire你可以使用何类型的存储方式。最常用的一个方式是使用SQL Server 作为存储(请查询Hangfire.SqlServer)。在你安装完这些nuget包后,你可以配置你的项目来使用Hangfire。

首先,我们更改Startup类的 ConfigureServices 方法来添加Hangfire的依赖注入,并且配置存储方式以及连接字符串。

  1. services.AddHangfire(config =>
  2. {
  3. config.UseSqlServerStorage(_appConfiguration.GetConnectionString("Default"));
  4. });

然后我们可以在 Configure 方法中添加对UseHangfireServer的调用。

  1. app.UseHangfireServer();

如果你想使用Hangfire的Dashboard,你也可这样做:

  1. app.UseHangfireDashboard();

如果你想要授权认证dasboard,你可以像下面一样使用AbpHangfireAuthorizationFilter:

  1. app.UseHangfireDashboard("/hangfire", new DashboardOptions
  2. {
  3. Authorization = new[] { new AbpHangfireAuthorizationFilter("MyHangFireDashboardPermissionName") }
  4. });

上面的配置是集成hangfire到ASP.NET Core应用的标准配置。我们也应该配置web模块来替换ABP默认的后台工作管理器。

  1. [DependsOn(typeof (AbpHangfireAspNetCoreModule))]
  2. public class MyProjectWebModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. Configuration.BackgroundJobs.UseHangfire();
  7. }
  8. //...
  9. }

我们添加 AbpHangfireModule 作为依赖,并使用 Configuration.BackgroundJobs.UseHangfire 方法来替换ABP默认的后台工作管理器。

注意:Hangfire需要在数据库中有创建Schema的权限,因为在首次运行后,它会创建自己的架构和表。

详细请查阅HangFire文档

7.2.3 ASP.NET MVC 5.X 集成

对于ASP.NET MVC 5.x 项目,我们可以使用 Abp.HangFire

  1. Install-Package Abp.HangFire

对于Hangfire你可以使用何类型的存储方式。最常用的一个方式是使用SQL Server 作为存储(请查询Hangfire.SqlServer)。在你安装完这些nuget包后,你可以配置你的项目来使用Hangfire。如下所示:

  1. [DependsOn(typeof (AbpHangfireModule))]
  2. public class MyProjectWebModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. Configuration.BackgroundJobs.UseHangfire(configuration =>
  7. {
  8. configuration.GlobalConfiguration.UseSqlServerStorage("Default");
  9. });
  10. }
  11. //...
  12. }

上面我们添加了被依赖项 AbpHangfireModule 并且用 Configuration.BackgroundJobs.UseHangfire 方法来开启和配置了Hangfire(“Default”是配置在web.config中的连接字符串)。

注意:Hangfire需要在数据库中有创建Schema的权限,因为在首次运行后,它会创建自己的架构和表。

详细请查阅HangFire文档

7.2.4 Hangfire Dashboard 授权

Hangfire可以显示一个 Dashboard 页面来查看所有后台工作的实时状态。你可以按照文档中描述的来配置。默认该页面对所有用户都是可用的,没有权限限制。使用Abp.HangFire包中的 AbpHangfireAuthorizationFilter 类,你可以集成它到ABP的权限认证系统。示例配置如下:

  1. app.UseHangfireDashboard("/hangfire", new DashboardOptions
  2. {
  3. Authorization = new[] { new AbpHangfireAuthorizationFilter() }
  4. });

这个可以检查当前用户是否登录到该应用。如果你想要一个额外的许可,你可以传递一个参数到它的构造函数:

  1. app.UseHangfireDashboard("/hangfire", new DashboardOptions
  2. {
  3. Authorization = new[] { new AbpHangfireAuthorizationFilter("MyHangFireDashboardPermissionName") }
  4. });

注意:在你的启动类的(可能是最后一行)授权中间件之后 UseHangfireDashboard 应该被调用,否则身份认证将会失败。