我想从我的脚本任务内部访问 MS Graph API。 我没有让 SDK 工作(至少在 SSIS 中),所以我想我应该使用 System.Net.Http HttpClient 编写自己的类。在 SSIS 之外,我没有遇到任何问题使其正常工作。当我尝试在 SSIS 中运行 HttpClient.SendAsync() 时,我收到了错误。
public void Main()
{
var HttpClient = new HttpClient();
var req_msg = new HttpRequestMessage(HttpMethod.Get, "http://ip.jsontest.com/");
HttpResponseMessage t = System.Threading.Tasks.Task.Run(async () =>
await HttpClient.SendAsync(req_msg)).Result;
MessageBox.Show(t.StatusCode.ToString()); // -> OK
var req_msg2 = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/users/{test_name}");
HttpResponseMessage t2 = System.Threading.Tasks.Task.Run(async () =>
await HttpClient.SendAsync(req_msg2)).Result; // -> Error
MessageBox.Show(t2.StatusCode.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
}
这是错误:
bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
bei Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
这可能与 Https 有关,至少这是我的理论。然后在常规的 C# 项目中这又不是问题了。
getAsync(), postAsync(), ... 也是同样的方式
事实证明 HttpClient 没有使用(正确的)安全协议。显然我根本不是该主题的专家,但使用以下代码将脚本开头的安全协议更改为 TLS 1.2:
System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)3072;
彻底解决了我的问题。希望这对某人有帮助