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

HangFire 1.6.20 State表Data列日期格式异常问题排查及修复

HangFire 1.6.20失败任务仪表盘异常问题排查与修复

问题现象

在使用HangFire 1.6.20的项目中,启用HangFire仪表盘排查代码问题时,切换到失败任务第二页会抛出异常。

根因定位

经调试确认,数据库[HangFire].[State]表的Data列中FailedAt字段存在两种日期格式,是引发异常的直接原因:

执行SQL查询:

select top 1000 s.data from [HangFire].[Job] j
    join [HangFire].[State] s on j.StateId = s.Id
where j.StateName = 'Failed'

返回结果显示两种格式:

{"FailedAt":"2022-11-30T15:34:13.7419289Z","ExceptionType":"..."}
{"FailedAt":"1669822299229","ExceptionType":"..."}
  • 第一条为正常的ISO 8601格式
  • 第二条为毫秒级时间戳格式,仅旧记录存在该问题

疑问解答

格式差异成因

这是HangFire 1.6.x版本的已知bug,早期版本中FailedAt字段的序列化逻辑存在缺陷,导致部分失败任务的时间被序列化为毫秒时间戳而非标准ISO 8601格式。

与DI注册配置的关系

该问题与HangFire的DI注册配置无关,排查过程中未发现Newtonsoft.Json的特殊注册会引发此格式差异。

基础设施变更的影响

不同区域服务器等基础设施变更不会导致此问题,格式差异仅由HangFire版本内部的序列化逻辑缺陷引发。

已完成排查

  • 代码中未找到影响日期序列化的Newtonsoft.Json特殊配置
  • Git历史与部署记录中未发现相关关键变更

修复方案

执行以下SQL脚本,将时间戳格式的FailedAt字段批量转换为标准ISO 8601格式:

注意:执行前请先查询待更新记录数量,避免批量操作导致服务器过载

update [HangFire].[State]
set data = JSON_MODIFY(data, '$.FailedAt', 
                CONVERT(VARCHAR(33), 
                    DATEADD(ms, 
                        cast(JSON_VALUE (data, '$.FailedAt') as bigint) % 1000, DATEADD(SECOND, cast(JSON_VALUE (data, '$.FailedAt') as bigint) / 1000, '19700101'))
                    , 126)
            )
where data like '{"FailedAt":"16%'
    or data like '{"FailedAt":"15%'

内容的提问来源于stack exchange,提问作者user1845593

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:41:24