Hangfire 是一个强大的任务调度框架,可以轻松实现后台任务处理。它支持 .NET 和 .NET Core 项目,能够处理定时任务、延迟任务和持久化任务,适用于 Web 应用和微服务架构。
Hangfire 官网:https://www.hangfire.io/
Hangfire GitHub地址:https://github.com/HangfireIO
以下是 Hangfire 的安装与使用教程,涵盖基础配置、任务类型和常见问题。
1. Hangfire 简介
Hangfire 的核心特点包括:
- 支持持久化:任务状态可以存储在数据库中,即使应用程序崩溃也能恢复执行。
- 多任务类型:支持即时任务、延迟任务和定时任务。
- 分布式支持:可以在多个服务器上运行任务。
- 内置仪表盘:可视化查看任务状态。
2. 安装 Hangfire
首先,需要一个 ASP.NET Core 项目。在项目中安装 Hangfire 和对应的数据库存储包(以 SQL Server 为例):
Install-Package Hangfire
Install-Package Hangfire.SqlServer
3. 配置 Hangfire
在 Startup.cs或者Program.cs 文件中配置 Hangfire:
using Hangfire;
using Hangfire.SqlServer;
var builder = WebApplication.CreateBuilder(args);
// 配置 Hangfire 使用 SQL Server 作为存储
builder.Services.AddHangfire(config =>
config.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseDefaultTypeSerializer()
.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true
}));
// 添加 Hangfire 服务
builder.Services.AddHangfireServer();
var app = builder.Build();
// 配置 Hangfire Dashboard
app.UseHangfireDashboard();
app.MapGet("/", () => "Hangfire Running!");
app.Run();
配置数据库连接
在 appsettings.json 文件中添加 Hangfire 数据库连接字符串:
"ConnectionStrings": {
"HangfireConnection": "Server=your_server;Database=HangfireDB;User Id=your_user;Password=your_password;"
}
4. Hangfire 的任务类型
立即执行的任务(Fire-and-forget):
var backgroundJobs = app.Services.GetService<IBackgroundJobClient>();
// 解析服务并使用
// 创建一个 Fire-and-forget 类型的后台任务,即立即执行一次
backgroundJobs.Enqueue(() =>
Console.WriteLine("Hello Hangfire!,后台任务,即立即执行一次"));
延迟任务(Delayed jobs):
// 延迟任务,1 分钟后执行
backgroundJobs.Schedule(() =>
Console.WriteLine("延迟任务,1 分钟后执行"),
TimeSpan.FromMinutes(1));
周期性任务(Recurring jobs):
//周期性任务,每天执行一次
RecurringJob.AddOrUpdate("easyjob", () =>
Console.WriteLine("Easy!:周期性任务,每天执行一次"),
Cron.Daily);
//周期性任务 ,corn表达式
RecurringJob.AddOrUpdate("powerfuljob",
() => Console.WriteLine("Powerful!,周期性任务:每秒执行一次"),
"0/1 * * * * ? "); //每秒执行一次【https://cron.ciding.cc】
5. 访问 Hangfire Dashboard
app.UseHangfireDashboard();
配置完成后,你可以通过访问 http://localhost:5000/hangfire 来查看 Hangfire Dashboard,监控任务的执行情况。
6. 安全性 Hangfire Dashboard 访问权限验证
在生产环境中,你需要为 Hangfire Dashboard 设置权限验证。可以通过实现 IDashboardAuthorizationFilter 接口来自定义授权逻辑。
Install-Package Hangfire.Dashboard.Authorization
代码示例:
public class BasedAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize([NotNull] Hangfire.Dashboard.DashboardContext context)
{
if (context.GetHttpContext().Request.Host.ToString().StartsWith("localhost"))
{
return true;
}
// 检查 context 参数是否为 null
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
// 获取当前请求的用户标识
var httpContext = context.GetHttpContext();
var authUser = httpContext?.User;
// 这里可以根据需要实现具体的授权逻辑
// 检查用户是否在某个角色内,或者是否有特定的权限标记
bool isAuthorized = authUser?.Identity?.IsAuthenticated == true
&& authUser.IsInRole("YourRoleName"); // 替换 "YourRoleName" 为实际的角色名称
return isAuthorized;
}
}
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new List<IDashboardAuthorizationFilter> { new BasedAuthorizationFilter() }
}); // 设置 Dashboard 的 URL