惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
G
Google Developers Blog
博客园 - 叶小钗
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
博客园_首页
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
Cloudbric
Cloudbric
AI
AI
N
News | PayPal Newsroom
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
Forbes - Security
Forbes - Security
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
SecWiki News
SecWiki News
H
Heimdal Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
V
V2EX
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
S
Security Affairs
L
LangChain Blog
The Hacker News
The Hacker News
F
Full Disclosure
aimingoo的专栏
aimingoo的专栏
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
Webroot Blog
Webroot Blog
A
About on SuperTechFans
H
Hacker News: Front Page
Cyberwarzone
Cyberwarzone
WordPress大学
WordPress大学
L
LINUX DO - 热门话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
M
MIT News - Artificial intelligence

博客园 - 猫狼

安卓连接usb camera 安卓手机连接USB摄像头代码 安装Memurai 把“休眠”功能找回来,并设置成一合上盖子就生效 mathtype安装后在office无法启动,提示运行时错误53, 文件未找到:MathPage.WLL SQL SERVER 数据库压缩日志步骤 Latex的一个错误, SQL 学习笔记 升级 ASP.NET 网站项目到 C# 6.0 或更高版本 C#程序集合并工具-ILRepack manim 安装 manim一个坑爸爸的问题 manim安装纪实 去掉快捷方式的小箭头 VS2022转到定义功能异常解决方案 url 传递加号,asp.net解析参数的正确处理参数 获取自然周数的下拉列表 移出Json对象的三级属性 梦记:又要去交流? 一段VBA的代码,到处是坑 多个AJAX请求,带执行进度及结果 C# 返回文件夹及子目录 解决JS跨域访问的问题 利用Jquery的map函数将json数据行转化为表格 模访京东商城jQuery省市区三级联动选择(横向DIV)
ASP.NET Web Site Project 中集成 Hangfire 并实现图片/视频压缩后台任务
猫狼 · 2026-04-23 · via 博客园 - 猫狼

今天在 ASP.NET Web Site Project 中集成 Hangfire 并实现图片/视频压缩后台任务,遇到了一系列技术挑战,最终全部解决。下面是关键问题与解决方法的总结:


一、Hangfire 集成与启动问题

问题1:OWIN 启动类无法被发现,/hangfire 返回 404

  • 现象:访问 /hangfire 时出现 404,Startup.csConfiguration 方法断点未命中。

  • 原因:Web Site Project 中 OWIN 自动发现机制不可靠,且 Global.asaxApplication_Start 未正确配置。

  • 解决

    • 放弃 OWIN 自动发现,改用 Global.asaxApplication_Start 手动配置 Hangfire 存储并启动 BackgroundJobServer

    • 删除 App_Code 下多余的 Global.asax,只保留根目录下的 Global.asax

    • web.config 中添加 <add key="owin:AutomaticAppStartup" value="false" /> 禁用 OWIN 自动发现。

问题2:Current JobStorage instance has not been initialized yet

  • 现象:创建 BackgroundJobServer 时抛出此异常。

  • 原因:未在 BackgroundJobServer 之前调用 GlobalConfiguration.Configuration.UseSqlServerStorage

  • 解决:确保在 Application_Start先配置存储,后启动服务器

问题3:Application_Start 未执行,日志未生成

  • 现象Global.asax 中的 Application_Start 没有输出日志。

  • 原因:IIS 应用程序池未设置为 AlwaysRunning,或网站未预加载。

  • 解决

    • 设置应用程序池:启动模式 = AlwaysRunning闲置超时 = 0

    • 设置网站:预加载已启用 = True

问题4:Hangfire 任务卡在 Enqueued 状态不执行

  • 现象:数据库 HangFire.Job 表中有任务但状态一直是 Enqueued

  • 原因BackgroundJobServer 未成功启动或被 IIS 回收。

  • 解决:通过上述 IIS 配置保证服务器常驻,同时在 Application_Start 中正确启动服务器。


二、图片压缩问题(SkiaSharp)

问题5:Unable to load library 'libSkiaSharp'

  • 现象:压缩图片时抛出 DllNotFoundException

  • 原因:SkiaSharp 依赖原生库 libSkiaSharp.dll,Web Site Project 不会自动将其复制到 bin 目录。

  • 解决

    • 安装 SkiaSharp.NativeAssets.Win32(或 Win64)NuGet 包。

    • 手动从包目录(~/.nuget/packages/skiasharp.nativeassets.win32/版本号/runtimes/win-{x86|x64}/native/)找到 libSkiaSharp.dll

    • 将其复制到网站的 bin 目录下。

    • 确保应用程序池位数与 DLL 位数匹配。

问题6:HttpContext.Current 在后台任务中为 null,导致日志写入失败

  • 现象WriteLog 方法中使用 HttpContext.Current.Request.PhysicalApplicationPath 引发“请求在此上下文中不可用”。

  • 原因:Hangfire 后台任务执行时没有 HTTP 上下文。

  • 解决:将 WriteLog 中的路径获取改为 AppDomain.CurrentDomain.BaseDirectoryHostingEnvironment.ApplicationPhysicalPath


三、视频压缩问题(FFmpeg)

问题7:FFmpeg 压缩后视频体积变大且不清晰

  • 现象:3.76MB 视频压成了 5.76MB,画质下降。

  • 原因:使用了 -preset veryfast 导致压缩效率低,且原始视频可能已高度压缩,重新编码时反而膨胀。

  • 解决

    • 改用 -preset medium-preset slow 获得更好压缩率。

    • 调整 -crf 值(如 23 → 28)增大压缩力度。

    • 可选添加 -vf scale=1280:-2 降低分辨率。

问题8:FFmpeg 共享版导致文件占用,删除/移动失败

  • 现象:压缩完成后无法删除原文件或移动临时文件,提示文件被占用。

  • 原因:使用的 FFmpeg 为共享版(--enable-shared),依赖多个 DLL,进程退出后文件句柄未及时释放。

  • 解决

    • 换用静态编译版 FFmpeg(从 gyan.dev 下载),只需一个 ffmpeg.exe

    • 在代码中添加 Thread.Sleep(100) 和文件操作重试循环。

    • 使用 Process 时正确等待退出、关闭进程、异步读取错误流。

问题9:FFmpeg 路径与部署

  • 现象:服务器上 FFmpeg 路径问题。

  • 解决

    • 推荐将静态版 ffmpeg.exe 放在网站 bin 目录下,代码中使用绝对路径或 AppDomain.CurrentDomain.BaseDirectory + "bin/ffmpeg.exe"

    • 或者设置系统环境变量,但 IIS 可能无法继承,不如直接指定路径可靠。


四、配置与监控完善

  • 连接字符串:统一在 web.config<connectionStrings> 中配置,供 Hangfire 和业务代码共用。

  • 日志系统:改造 WriteLog 使其不依赖 HttpContext,并在 App_Data 或指定目录输出。

  • Hangfire Dashboard:虽然 Web Site Project 中 OWIN 启动困难,但最终通过 Global.asax 手动启动服务器,Dashboard 仍可访问(需正确配置 OWIN 启动类或使用第三方方案,用户最终放弃 Dashboard,改用数据库查询和自定义日志监控)。

  • 任务重试:Hangfire 默认自动重试,可通过 [AutomaticRetry] 特性调整。


最终成果

  • ✅ Hangfire 后台任务稳定运行,任务不再卡在 Enqueued

  • ✅ 图片压缩功能正常,原生库正确加载。

  • ✅ 视频压缩功能正常,参数优化后体积合理,文件操作不再报错。

  • ✅ 日志系统健壮,不依赖 HTTP 上下文。

  • ✅ IIS 配置优化,应用程序池始终运行,后台任务不因空闲而停止。


经验教训

  1. Web Site Project 对 OWIN 支持不友好,尽量使用 Global.asax 手动启动 Hangfire。

  2. SkiaSharp 需要手动部署原生库,不能仅依赖 NuGet 自动复制。

  3. FFmpeg 优先使用静态编译版,避免 DLL 依赖和文件锁定问题。

  4. 后台任务中避免使用 HttpContext.Current,改用 AppDomainHostingEnvironment

  5. IIS 必须配置为 AlwaysRunning + 预加载,否则后台服务会被回收。

  6. 文件操作要添加重试和延时,以应对进程释放句柄的延迟。

今天的问题虽然曲折,但最终全部攻克。如果以后遇到类似需求,可以快速参考这套方案。