You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core项目Hangfire旧服务器反复出现执行旧代码如何解决?

Hangfire旧服务器残留、执行旧代码解决方案

问题根因说明

你手动删除数据库中旧服务器记录后依旧反复重现,核心原因是运行旧版本代码的进程并未被真正终止,这些残留进程会持续向Hangfire存储发送心跳,发现自身注册记录被删除后会自动重新注册,同时会继续拉取队列中的任务执行旧代码。

解决步骤

1. 彻底终止所有旧版本进程

  • 若为IIS部署:先停止目标站点与对应的应用程序池,再手动结束任务管理器中所有关联的w3wp.exe、dotnet.exe进程,确认无残留后再启动新版本站点
  • 若为容器/云实例部署:排查所有运行中的Pod/容器实例,彻底销毁旧版本实例后再启动新版本
  • 若为本地开发环境:结束所有后台残留的dotnet run进程、VS IIS Express进程,全量重新编译后再启动项目

2. 优化Hangfire配置隔离新旧版本

在AddHangfireServer中添加版本标识,避免新旧版本争抢任务:

services.AddHangfireServer(options => 
{
    // 服务器名称添加版本号前缀,区分新旧实例
    options.ServerName = $"MyApp_V2_{Guid.NewGuid():N}";
    // 可选:配置专属队列,新版本任务仅分配给新实例处理
    options.Queues = new[] { "v2_default" };
});

调度任务时指定对应新版本队列:

var id = client.Schedule(() => Repository.MyJob(), TimeSpan.FromMinutes(1), queue: "v2_default");

3. 清理残留任务数据

  • 确认所有旧进程终止后,再删除Hangfire相关表让其自动重建,避免旧进程恢复表数据
  • 启动新版本后,在Hangfire仪表盘手动删除所有待处理、调度中的历史任务,避免旧任务被触发执行
  • 可选:配置任务自动过期策略,清理历史残留任务:
services.AddHangfire(config => 
{
    config.UseSqlServerStorage("你的数据库连接串", new SqlServerStorageOptions
    {
        // 每小时清理一次过期任务
        JobExpirationCheckInterval = TimeSpan.FromHours(1),
        DeleteExpiredBatchSize = 1000
    });
});

4. 生效验证

启动新版本应用后,先检查Hangfire仪表盘服务器列表,确认仅存在带新版本标识的实例,再触发测试任务确认执行的是最新代码即可。

内容的提问来源于stack exchange,提问作者Shawn A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:04