c# - Microsoft.CrmSdk.XrmTooling.CoreAssembly 与 Targetframework .NET 4.5.2 在 CrmServiceClient.Execute 上导致 NullReference 异常
问题描述
我们在面向 .NET 4.5.2 的普通控制台应用程序中使用以下代码连接到 Dynamics 365 CRM。
private static void Main(string[] args)
{
RetrieveAllEntitiesRequest req2 = new RetrieveAllEntitiesRequest();
req2.EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Entity;
CrmServiceClient conn = new CrmServiceClient(
"svccrm@contoso.com",
CrmServiceClient.MakeSecureString("secret"),
"EMEA", "contoso",
useUniqueInstance: true,
useSsl: true, isOffice365: true);
try
{
//error with target framework 4.5.2
var resp2 = conn.Execute(req2) as RetrieveAllEntitiesResponse;
}
catch
{
string lastError = conn.LastCrmError;
}
}
以下 nuget 包位于 packages.config 中
<package id="Microsoft.CrmSdk.CoreAssemblies" version="9.0.2.5" targetFramework="net452" />
<package id="Microsoft.CrmSdk.Deployment" version="9.0.2.4" targetFramework="net452" />
<package id="Microsoft.CrmSdk.Workflow" version="9.0.2.4" targetFramework="net452" />
<package id="Microsoft.CrmSdk.XrmTooling.CoreAssembly" version="9.0.2.7" targetFramework="net452" />
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.22.302111727" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
当我运行此代码时,我在 Microsoft.Xrm.Tooling.Connector.CrmServiceClient.Execute(OrganizationRequest request) 处收到 NullReferenceException,LastCrmError 为
无法登录到 Dynamics CRM************ 异常 - RetrieveAllEntities:从 IOrganizationService 执行 (RetrieveAllEntities) 对 CRM 的请求 |=> 对象引用未设置为对象的实例。
一旦我将目标框架更改为 4.6.2,它就可以正常工作。问题是我们将此代码托管在 SQL Server 集成服务包中,出于某种原因,在 Windows 2016 上,SSIS 总是回退到 4.5.2 框架。
我们也在对此进行调查,但现在问题仍然存在,如果 Microsoft.CrmSdk.XrmTooling.CoreAssembly 包应该与 4.5.2 一起使用(nuget 自述文件说是),或者这是 SDK 中的错误。
最新的 .NET 4.7.X 框架已安装在 2016 服务器和我的 win 10 开发机器上,但两者都面临同样的问题。
解决方案
从版本 9 开始,Dynamics 365 强制执行 TLS 1.2,因为 .NET 4.5 默认使用 TLS 1.1,您会收到此错误。在上一篇文章中,您会发现客户端应用程序的解决方案是您已经尝试过的解决方案:
使用 .NET 框架4.6.2或更高版本重新编译您的客户端应用程序。
有一些关于如何从 SSIS 包(此处和此处)强制实施 TLS 1.2 的文章,但不幸的是我还没有尝试过。如果这些没有帮助,您可以通过将SchUseStrongCrypto
注册表设置更新为 DWORD:00000001 来解决该错误,如此处所述(为依赖组件启用 TLS 1.2/更新 .NET Framework 部分)。
推荐阅读
- python - 如何在 discord.py 中使用 Spotify 类?
- jenkins - jenkins 声明性管道集从参数派生的变量
- r - Travis CI - 将 GitHub 从 dev 推送到 master 分支
- python - 游戏排名系统:寻找击败人的人:我如何组织这个csv数据并附加文件?
- python - 如何在 Python 中将用户输入从一个脚本传递到另一个脚本?
- vb.net - 从 Access 数据库中提取数据时显示奇怪的代码 - 我将解释
- angular - 错误:服务命令需要在 Angular 项目中运行,但找不到项目定义
- javascript - setInterval 函数在 Vue 模板中不起作用
- javascript - 在函数中存储变量?
- java - 距离转换器问题