.net Framework 4.6 WebAPI 使用Hangfire

C# 使用 Hangfire

第一章 .net Framework 4.6 WebAPI 使用Hangfire



前言

在业务中常常遇到需要在后台定时执行的业务,例如:库存同步、数据定时推送拉取等,目前较为成熟的定时任务插件主要有hangfire,Quartz;这里我们就选择hangfire,选择它的原因主要是因为它自带了控制面板,单它也有缺点它不支持秒级定时。这里举例的业务主要是做库存同步,不需要精确到秒级。下面咱们就来看看怎么实现吧。


一、hangfire是什么?

Hangfire 是一个开源且商业免费使用的工具函数库。可以让你非常容易地在 ASP.NET 应用(也可以不在 ASP.NET 应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于 Windows Service 后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台

二、hangfire的特点

  • 支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue (() => Console.WriteLine (“Simple!”));

  • 延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule (() => Console.WriteLine (“Reliable!”), TimeSpan.FromDays (7));

  • 循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于 CRON 表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate (() => Console.WriteLine (“Transparent!”), Cron.Daily);

  • 持久化保存任务、队列、统计信息:默认使用 SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用 Redis 来获得更好的性能表现

  • 内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务

  • 除了调用静态方法外还支持实例方法

  • 能够捕获多语言状态:即可以把调用者的 Thread.CurrentCulture 和 Thread.CurrentUICulture 信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的

  • 支持任务取消:使用 CancellationToken 这样的机制来处理任务取消逻辑

  • 支持 IoC 容器:目前支持 Ninject 和 Autofac 比较常用的开源 IoC 容器

  • 支持 Web 集群:可以在一台或多台机器上运行多个 Hangfire 实例以便实现冗余备份

  • 支持多队列:同一个 Hangfire 实例可以支持多个队列,以便更好的控制任务的执行方式

  • 并发级别的控制:默认是处理器数量的 5 倍工作行程,当然也可以自己设定

  • 具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC 容器支持等

三、.net Framework 中hangfire的使用方法

第一步:创建WebAPI控制器

在这里插入图片描述
在这里插入图片描述

第二步:添加nuget包

这里需要注意的是我使用的是1.8.3,目前最新版是1.8.14,最新版使用中文的时候会有点问题导致控制面单无法展示中文。
在这里插入图片描述

第三步 创建startup类

新建项目startup类

具体步骤如下:
1、右键项目
2、添加
3、新建项目
4、选择OWIN Startup类
在这里插入图片描述

Startup类中具体的实现

这里需要注意的是:
代码中zh-CN处是将控制面板设置为中文的方法,此方法在1.8.14中设置是没有效果的,具体原因不得而知。

public class Startup
{
   
   


    public void Configuration(IAppBuilder app)
    {
   
   
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");

        GlobalConfiguration.Configuration
            .UseLog4NetLogProvider()
            .UseDefaultCulture(new CultureInfo("zh-CN"))
            .SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
            .UseSimpleAssemblyNameTypeSerializer()
            .UseRecommendedSerializerSettings()
            .UseSqlServerStorage(数据库连接字符串, new SqlServerStorageOptions
            {
   
   
                QueuePollInterval = TimeSpan.FromSeconds(15),
                JobExpirationCheckInterval = TimeSpan.FromHours(1),
                CountersAggregateInterval = TimeSpan.FromMinutes(5),
                PrepareSchemaIfNecessary = true,
                DashboardJobListLimit = 50000,
                TransactionTimeout = TimeSpan.FromMinutes(1)
                //TablesPrefix = "Hangfire"
            }).UseHangfireHttpJob();
                    app.UseHangfireDashboard();//配置后台仪表盘
                    app.UseHangfireServer();//开始使用Hangfire服务
                }
}

注意这里新增了startup文件之后需要安装“Microsoft.Owin.Host.SystemWeb” 包然后再webconfig中配置:
不然程序启动不会去走startup里的代码

<add key="owin:AutomaticAppStartup" value="true" />

第四步:创建动态添加Job的WebApi

接口返回类型model

 public class ResponseDTO
 {
   
   
     public bool Status {
   
    get; set; }
     public string Message {
   
    get; set; }
 }

业务执行帮助方法

private ResponseDTO Excute(Hangfire.HttpJob.Server.HttpJobItem httpJob)
{
   
   
    ResponseDTO rspModel = new ResponseDTO();
    try
    {
   
   
        using (var client = new HttpClient())
        {
   
   
            if (httpJob.Headers != null && httpJob.Headers.Count > 0)
            {
   
   
                foreach (var HeaderInfo in httpJob.Headers)
                {
   
   
                    client.DefaultRequestHeaders.Add(HeaderInfo.Key, HeaderInfo.Value);
                }
            }
            Dictionary<string, object> parames = new Dictionary<string, object>();
            if (!string.IsNullOrWhiteSpace(httpJob.Data))
            {
   
   
                parames = JsonConvert.DeserializeObject<Dictionary<string, object>>
<think>好的,我需要帮助用户了解如何在.NET 8.0 WebAPI中配置Hangfire。首先,我需要回忆Hangfire的基本概念和它在.NET项目中的作用。Hangfire是一个用于处理后台任务的开源库,支持定时任务、延迟任务和队列任务,适用于需要在后台执行长时间运行的操作的场景。 接下来,我得考虑在.NET 8.0 WebAPI项目中配置Hangfire的具体步骤。首先,用户需要安装相关的NuGet包。Hangfire的核心包包括Hangfire.Core、Hangfire.AspNetCore,以及用于存储的Hangfire.SqlServer,如果使用SQL Server作为存储的话。所以第一步应该是通过NuGet安装这些包。 安装完成后,下一步是在Program.cs文件中配置Hangfire服务。这里需要添加Hangfire的服务到依赖注入容器中,通常使用AddHangfire方法,并配置连接字符串指向SQL Server数据库。同时,可能还需要配置Hangfire的Dashboard,以便通过网页界面监控任务状态。这需要调用UseHangfireDashboard方法,并注意权限控制,避免未授权访问。 然后,用户需要初始化Hangfire的存储,确保数据库表已经创建。Hangfire使用SQL Server时会自动创建必要的表,但需要确认连接字符串正确无误,并且数据库有足够的权限。 接下来是使用Hangfire的示例部分。可能需要演示如何创建后台任务、延迟任务和定时任务。比如,使用BackgroundJob.Enqueue方法执行即时任务,BackgroundJob.Schedule执行延迟任务,以及RecurringJob.AddOrUpdate设置定时任务。这些示例需要确保代码正确,并且参数如Cron表达式是有效的。 此外,需要注意的细节包括:在开发环境和生产环境中Dashboard的访问权限控制,可能通过环境判断来限制访问;Hangfire服务需要在应用启动时正确配置,避免因配置错误导致任务无法执行;以及确保数据库连接稳定,避免存储问题导致任务丢失。 用户可能还会遇到常见问题,比如Dashboard无法访问,这时候需要检查中间件的顺序是否正确,或者权限设置是否过于严格。另外,任务没有执行可能需要检查Hangfire的服务是否正常启动,或者存储配置是否正确。 最后,总结整个配置过程,强调关键步骤和注意事项,帮助用户巩固理解。可能需要提醒用户在实际项目中根据需求调整配置,例如使用不同的存储方式,或者更复杂的权限控制策略。</think>在.NET 8.0 WebAPI中配置Hangfire可分为以下步骤: --- ### **1. 安装NuGet包** 通过NuGet安装以下核心依赖: ```bash Install-Package Hangfire.AspNetCore Install-Package Hangfire.SqlServer # 如果使用SQL Server作为存储 ``` --- ### **2. 配置服务与中间件** 在`Program.cs`中添加Hangfire服务: ```csharp var builder = WebApplication.CreateBuilder(args); // 添加Hangfire服务 builder.Services.AddHangfire(config => { config.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection")); }); builder.Services.AddHangfireServer(); // 启用后台任务处理服务器 ``` --- ### **3. 初始化数据库存储** 若使用SQL Server,需确保: - 配置文件中包含连接字符串: ```json "ConnectionStrings": { "HangfireConnection": "Server=.;Database=HangfireTest;Integrated Security=SSPI;" } ``` - 首次运行时,Hangfire会自动创建所需表。 --- ### **4. 启用Hangfire Dashboard** 在`Program.cs`中添加中间件: ```csharp var app = builder.Build(); // 配置Dashboard(建议限制访问权限) app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } }); ``` --- ### **5. 创建任务授权过滤器(可选)** 防止未授权访问Dashboard: ```csharp public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { public bool Authorize(DashboardContext context) { // 示例:仅允许本地环境访问 var httpContext = context.GetHttpContext(); return httpContext.Request.IsLocal(); } } ``` --- ### **6. 编写任务示例** 在控制器或服务中调用: ```csharp // 即时任务 BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget任务执行!")); // 延迟任务(5分钟后执行) BackgroundJob.Schedule(() => Console.WriteLine("延迟任务执行!"), TimeSpan.FromMinutes(5)); // 定时任务(每分钟执行) RecurringJob.AddOrUpdate("my-recurring-job", () => Console.WriteLine("定时任务执行!"), Cron.Minutely); ``` --- ### **7. 运行与验证** 1. 启动WebAPI项目。 2. 访问`https://localhost:{port}/hangfire`打开Dashboard。 3. 查看任务执行状态及日志。 --- ### **注意事项** 1. **存储选择**:除SQL Server外,Hangfire支持Redis、PostgreSQL等。 2. **生产环境安全**:务必限制Dashboard的访问权限。 3. **依赖注入**:任务方法需为`public`,且依赖项需通过DI容器注入。 4. **异常处理**:通过`GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 3 })`配置自动重试。 --- ### **扩展场景** - **集成MediatR**:将Hangfire与MediatR结合,处理复杂后台逻辑。 - **分布式部署**:多节点部署时需配置相同的存储数据库。 - **性能监控**:通过Dashboard分析任务执行时间及失败率。 如需进一步优化,可参考[Hangfire官方文档](https://www.hangfire.io/)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李袁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值