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

SSIS脚本任务中调用HttpClient.SendAsync访问MS Graph API报错

SSIS脚本任务调用MS Graph API HTTPS接口失败的解决方案

问题概述

在SSIS脚本任务中使用HttpClient调用HTTP接口正常,但调用HTTPS的MS Graph API时报错,非SSIS环境下代码运行正常。错误堆栈显示脚本执行时反射调用出错,推测与HTTPS相关配置或SSIS运行环境特性有关。

可能原因及对应解决方案

1. TLS版本不兼容

MS Graph API要求使用TLS 1.2或更高版本,而SSIS默认可能未启用该版本的TLS协议。

解决方法:在创建HttpClient前强制设置TLS版本:

// 启用TLS 1.2
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
var HttpClient = new HttpClient();

2. HTTPS证书验证失败

SSIS运行环境可能缺少MS Graph API服务器证书对应的根证书,导致证书验证不通过;或者运行账号没有权限访问证书存储。

临时测试方案(不建议生产环境):跳过证书验证:

var handler = new HttpClientHandler();
// 跳过证书验证,仅用于测试
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
var HttpClient = new HttpClient(handler);

生产环境方案:在SSIS运行服务器上安装缺失的根证书(可通过浏览器访问Graph API地址,查看证书链并下载安装根证书)。

3. 同步阻塞导致死锁

使用Task.Run(async () => await ...).Result的方式在SSIS的同步上下文环境中可能引发死锁,导致任务无响应或报错。

解决方法:改用GetAwaiter().GetResult()替代.Result,避免死锁:

// 替换原有的Result调用方式
HttpResponseMessage t2 = HttpClient.SendAsync(req_msg2).GetAwaiter().GetResult();

4. 缺少Graph API授权头

MS Graph API需要有效的访问令牌才能调用,代码中未添加Authorization头会导致接口返回权限错误,进而引发后续异常。

解决方法:在请求中添加Bearer令牌:

var req_msg2 = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/users/{test_name}");
// 替换为你的有效访问令牌
req_msg2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "Your_Access_Token_Here");

完整修正后的示例代码

public void Main()
{
    // 启用TLS 1.2
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    
    // 初始化HttpClient(生产环境建议移除证书跳过验证)
    var handler = new HttpClientHandler();
    handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
    var HttpClient = new HttpClient(handler);

    // 测试HTTP接口
    var req_msg = new HttpRequestMessage(HttpMethod.Get, "http://ip.jsontest.com/");
    HttpResponseMessage t = HttpClient.SendAsync(req_msg).GetAwaiter().GetResult();
    MessageBox.Show(t.StatusCode.ToString());

    // 调用Graph API,添加授权头
    var test_name = "test_user@domain.com"; // 替换为实际用户名
    var req_msg2 = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/users/{test_name}");
    req_msg2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "Your_Valid_Access_Token");
    
    HttpResponseMessage t2 = HttpClient.SendAsync(req_msg2).GetAwaiter().GetResult();
    MessageBox.Show(t2.StatusCode.ToString());

    Dts.TaskResult = (int)ScriptResults.Success;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:55:05