部署SSIS包时HtmlAgilityPack抛出调用目标异常问题
解决SSIS中HtmlAgilityPack加载网页时的"Invocation Target"异常
这个问题我碰到过好几次,外层的Exception has been thrown by the target of an invocation.其实只是个包装异常,真正的故障原因藏在InnerException里,咱们一步步来排查和解决:
1. 先捕获并查看内部异常
首先必须拿到内部异常的详细信息,否则根本没法定位问题。修改你的代码,把加载逻辑放到try-catch块里,把内部异常输出到SSIS日志或者调试窗口:
try { // 建议改成HTTPS,目标站会自动重定向 var html = @"https://sqlserverbuilds.blogspot.com/"; HtmlWeb web = new HtmlWeb(); var htmlDoc = web.Load(html); } catch(Exception ex) { // 输出到SSIS错误日志 var errorDetails = $"外层异常信息:{ex.Message}\n" + $"内部异常信息:{ex.InnerException?.Message}\n" + $"内部异常堆栈:{ex.InnerException?.StackTrace}"; Dts.Events.FireError(0, "Html网页加载失败", errorDetails, string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; }
拿到内部异常后,就能精准定位问题——大概率是TLS版本、网络权限或者反爬限制的问题。
2. 最常见的修复:强制启用TLS 1.2
Windows Server 2016默认可能没有启用TLS 1.2,而现在包括blogspot在内的绝大多数网站已经不再支持旧的TLS 1.0/1.1协议。在代码最开头加上这行,强制使用TLS 1.2:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; // 如果服务器支持的话,也可以加上TLS 1.3 // System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls13;
注意:你代码里写的是HTTP地址,但目标网站会自动重定向到HTTPS,这时候协议不兼容就会触发连接错误,进而抛出包装后的Invocation异常。
3. 检查SSIS执行账户的网络权限
- 确认SSIS服务的运行账户有访问外网的权限,没有被服务器防火墙、企业代理拦截。
- 如果你的环境需要通过代理访问外网,给HtmlWeb配置代理:
HtmlWeb web = new HtmlWeb(); web.PreRequest = (request) => { request.Proxy = new System.Net.WebProxy("http://你的代理地址:端口号"); // 如果代理需要认证 // request.Proxy.Credentials = new System.Net.NetworkCredential("代理用户名", "代理密码"); return true; };
4. 验证HtmlAgilityPack的GAC部署
虽然你已经把DLL部署到GAC,但还是要确认:
- 用
gacutil -l HtmlAgilityPack命令检查GAC中的版本确实是1.7.4,和你开发环境引用的版本完全一致。 - 在SSIS脚本项目中,把HtmlAgilityPack的引用设置为复制本地=false,确保脚本任务加载的是GAC中的版本,而不是本地复制的DLL。
5. 绕过目标网站的反爬限制
Blogspot会拦截没有User-Agent标识的请求,给HtmlWeb设置一个合法的UA:
HtmlWeb web = new HtmlWeb(); web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36";
内容的提问来源于stack exchange,提问作者Darryl
相关产品推荐
相关产品推荐

