IIS托管ASP.NET Core应用中HtmlAgilityPack DLL突发加载失败排查
解决IIS托管ASP.NET Core 8.0中HtmlAgilityPack随机加载失败问题
针对你遇到的HtmlAgilityPack DLL随机加载失败问题,结合给出的环境配置,可从以下几个方向排查和解决:
1. 影子复制(Shadow Copy)的冲突问题
启用Shadow Copy时,IIS会将程序集复制到临时目录加载,若临时目录的副本因回收、权限或清理操作损坏/丢失,就会出现原DLL存在但加载失败的情况。
- 解决方案:
- 直接禁用Shadow Copy:在web.config的
<aspNetCore>节点中添加配置:<aspNetCore ... shadowCopyBinAssemblies="false" /> - 若需保留Shadow Copy,指定独立的临时目录并配置权限:
确保应用池身份对该目录有完整读写权限,同时排除该目录的系统自动清理规则。<aspNetCore ... shadowCopyDirectory="D:\CustomShadowCopy\MyApp" />
- 直接禁用Shadow Copy:在web.config的
2. 应用自动回收的优化
每日自动回收可能导致程序集加载上下文异常,尤其结合Shadow Copy时,回收过程中资源释放不彻底会引发后续加载问题。
- 解决方案:
- 若禁用回收后问题消失,调整回收触发条件:比如将固定时间回收改为仅当内存/CPU占用超过阈值时回收,避开业务高峰时段。
- 开启应用池的「回收时加载用户配置文件」选项,确保进程回收时资源释放更彻底。
3. Github Copilot忽略文件夹的验证
将appsettings移至copilot_ignore文件夹后,需确认部署流程未受影响:
- 检查点:
- 验证发布配置或部署脚本未将HtmlAgilityPack DLL误纳入忽略规则,确保它被正确复制到应用的bin目录。
- 确认copilot_ignore文件夹的权限与应用其他目录一致,避免权限继承问题间接影响程序集加载。
4. 程序集加载上下文与依赖排查
- 版本冲突检查:确认项目中仅引用了一个版本的HtmlAgilityPack,无依赖的其他程序集版本冲突。可通过NuGet包管理器或
dotnet list package命令核查。 - 预加载优化:在应用启动时预加载HtmlAgilityPack,避免后续动态加载出现异常。在Program.cs中添加:
using System.Reflection; var builder = WebApplication.CreateBuilder(args); // 预加载HtmlAgilityPack,替换为实际版本和公钥令牌 Assembly.Load("HtmlAgilityPack, Version=1.11.54.0, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a");
5. 系统临时文件清理的规避
系统自带的磁盘清理工具可能误删Shadow Copy的临时文件,导致加载失败:
- 解决方案:将Shadow Copy临时目录设置为非系统默认的临时文件夹,并在系统清理规则中排除该目录。
内容的提问来源于stack exchange,提问作者redrobot
相关产品推荐
相关产品推荐

