CrmServiceClient Error: 2 : Unable to connect to CRM: Method not found: OrganizationDetail.get_EnvironmentId()

CrmServiceClient Error: 2 : Unable to connect to CRM: Method not found: OrganizationDetail.get_EnvironmentId()

尝试将两个现有应用程序从使用 OAuth 和 GUI 用户切换到应用程序用户,我遇到了一个问题,即在部署到目标机器时使用 Microsoft.Xrm.Tooling.Connector.CrmServiceClient 连接到 CRM 失败,但它工作正常运行 在 Visual Studio.

我收到的跟踪 CrmServiceClient 的错误是:

Microsoft.Xrm.Tooling.Connector.CrmServiceClient Error: 2 : Unable to connect to CRM: Method not found: 'System.String Microsoft.Xrm.Sdk.Organization.OrganizationDetail.get_EnvironmentId()'.

到目前为止,身份验证本身似乎工作得很好:

Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : Initialize CRM connection Started - AuthType: ClientSecret
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : Direct Login Process Started
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : Attempting to Connect to Uri https://xxx.crm.dynamics.com/XRMServices/2011/Organization.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : DiscoveryServer indicated organization service location = https://xxx.crm.dynamics.com/XRMServices/2011/Organization.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : Organization Service URI is = https://xxx.crm.dynamics.com/XRMServices/2011/Organization.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : ConnectAndInitCrmOrgService - Initializing Organization Service Object
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : ConnectAndInitCrmOrgService - Requesting connection to Organization with CRM Version: No organization data available
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : AuthenticateService - found authority with name https://login.microsoftonline.com/xxx/oauth2/authorize
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : AuthenticateService - found resource with name https://xxx.crm.dynamics.com/
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : ObtainAccessToken - Client Secret
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : Added WebClient Header Hooks to the Request object.
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : ConnectAndInitCrmOrgService - Proxy created, total elapsed time: 00:00:00.7981767

重现问题的代码

using System;
using System.Net;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Tooling.Connector;

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            string cs = "AuthType=ClientSecret;Url=https://xxx.crm.dynamics.com;ClientId=00000000-0000-0000-0000-000000000000;ClientSecret=my-secret-here";
            CrmServiceClient client = new CrmServiceClient(cs);

            if (!client.IsReady)
            {
                throw new Exception(client.LastCrmError);
            }

            var service = client.OrganizationWebProxyClient;

            var whoamirequest = new WhoAmIRequest();

            var whoamiresponse = service.Execute(whoamirequest);
        }
    }
}

引用的包是

Microsoft.CrmSdk.CoreAssemblies 9.0.2.25
Microsoft.CrmSdk.Deployment9.0.2.25
Microsoft.CrmSdk.Workflow9.0.2.25
Microsoft.CrmSdk.XrmTooling.CoreAssembly9.1.0.42
Microsoft.IdentityModel.Clients.ActiveDirectory 3.19.8
Microsoft.Rest.ClientRuntime 2.3.20
Newtonsoft.Json10.0.3

我尝试将目标框架版本从 4.6.2 更改为 4.8,并尝试了多个版本的相关包。

我构建和调试的机器与我 运行 应用程序所在的机器之间唯一明显的区别是开发机器具有 .NET Framework 4.6.2 和 4.8 的开发人员包,而另一台机器具有客户端配置文件 .NET Framework。

问题是由目标计算机的 GAC 中安装的 Microsoft.Xrm.Sdk.dll 的早期版本 (9.0.9002.0) 引起的。

此程序集包含显示在跟踪日志中的部分代码 Microsoft.Xrm.Sdk.Organization.OrganizationDetail.get_EnvironmentId()

使用 gacutil /l Microsoft.Xrm.Sdk,您可以识别 GAC 中部署了哪些版本。
在我的例子中,它是为本机上的其他服务 运行 使用而部署的早期版本。

由于在这种情况下从 GAC 中删除有问题的版本不是一个可行的选择,我只是将 Microsoft.Xrm.Sdk 的新版本 (9.0.46.3545) 导入到 GAC 中。