通过客户端凭证连接到D365在.net 4.6.2控制台应用程序中工作,相同的代码在SSIS脚本任务中失败



在SSIS脚本任务(目标服务器版本为SQL 2016, VSTA项目目标框架设置为4.6.2)中构造Microsoft.Xrm.Tooling.Connector.CrmServiceClient对象后,IsReady属性为假,CurrentAccessToken属性为

"客户机"。CurrentAccessToken'抛出了类型为'System.NullReferenceException'"的异常

相同的代码在。net 4.6.2控制台应用程序中工作如预期。(问题末尾的代码)。

如果我用无效的参数(例如URI、客户端id或客户端秘密)构造CrmServiceClient,我可以在控制台应用程序中复制该行为。但是我在SSIS中使用的值与我在工作控制台应用程序中使用的值完全相同。

由于缺少这个令牌,当我尝试使用客户端时,例如:

var query = new QueryExpression("account");
var results = client.RetrieveMultiple(query);

…在RetrieveMultiple调用时抛出空引用异常。

这两种解决方案的主要区别在于控制台应用程序可以使用nuget包,而SSIS环境在VSTA中,因此必须手动添加引用。为了获得SSIS任务的正确dll集,我构建了控制台应用程序以在该项目的binDevelopment文件夹中生成dll,然后通过在SSIS VSTA项目中通过add-reference浏览它们来引用这些dll。

我不明白为什么SSIS脚本无法获得令牌,而控制台应用程序成功。

指出:

(1)我知道现在连接Dynamics 365的首选方法是使用Microsoft.PowerPlatform.Dataverse.Client。然而,这个nuget包有许多更多的依赖项,并且在SSIS VSTA环境中导致更大的问题(例如依赖于Microsoft.Extensions.Configuration.Abstractions 3.1.8,但是当SSIS运行时,它说它找不到3.0.0,并且告诉VSTA项目每个https://github.com/dotnet/extensions/issues/2931生成绑定重定向并不能解决问题)

(2)添加ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;没有影响。

(3)连接到Microsoft Dynamics 365在控制台应用程序中工作,但不在web应用程序中描述相同的错误,但我没有部署web应用程序。

// console app:
using Microsoft.Xrm.Sdk;
using System;
namespace D365Test
{
internal class Program
{
private static void Main(string[] args)
{
Microsoft.Xrm.Tooling.Connector.CrmServiceClient client = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient
(
new Uri(@"https://MyOrg.crm6.dynamics.com"),
@"myClientId",
@"myClientSecret",
false,
null
);
}
}
}
// SSIS script:
public override void CreateNewOutputRows()
{
Microsoft.Xrm.Tooling.Connector.CrmServiceClient client = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient
(
new Uri(@"https://MyOrg.crm6.dynamics.com"),
@"myClientId",
@"myClientSecret",
false,
null
);
// ...
}

我假设Microsoft.Xrm是一个nuget包,如果是这样,那些不"工作";SSIS。参见SSIS脚本:名称空间中不存在-错误不断返回-我错过了什么?

最新更新