0

我需要创建在 CRM Online 中检索记录的插件。此插件将在 Dynamics CRM 365 On-Premise 上注册。我已经尽我所能来创建这个插件,也在互联网上搜索教程。但是,每次我测试插件时。它总是说

“元数据包含无法解析的参考https://office.api.crm5.dynamics.com/XRMServices/2011/Organization.svc

第一次收到此错误后,我检查上面的链接是否可以在我的电脑中搜索。而且我确定该链接是可搜索的。通过 CRM 365 插件连接 CRM Online。我使用这段代码:

 private static void ConnectToMSCRM()
    {
        try
        {

            ClientCredentials credentials = new ClientCredentials();
            credentials.UserName.UserName = "admin@office.onmicrosoft.com";
            credentials.UserName.Password = "crmpass";
            ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
            Uri serviceUri = new Uri("https://office.api.crm5.dynamics.com/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(serviceUri, null, credentials, null);
            proxy.EnableProxyTypes();

另一方面,我写这篇文章是为了检查我是否可以在线连接到 CRM:

IPluginExecutionContext context = (IPluginExecutionContext)serprov.GetService(typeof(IPluginExecutionContext));
        IOrganizationServiceFactory serfac = (IOrganizationServiceFactory)serprov.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serfac.CreateOrganizationService(context.UserId);

        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
        {
            Entity ent = (Entity)context.InputParameters["Target"];

           // presaledid = ent.GetAttributeValue<String>("new_presalesid");
            try
            {
                ConnectToMSCRM();
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException(ex.Message);
            } 

            Guid userid = ((WhoAmIResponse)_service.Execute(new WhoAmIRequest())).UserId;
            if (userid != Guid.Empty)
                return;

那些代码返回错误信息。元数据包含无法解析的引用。奇怪的是,当我在控制台应用程序中使用相同的代码时,我能够连接到 CRM Online。我对此有点沮丧。快 5 天仍然没有得到解决方案。如果您对我有修复错误的建议。请告诉我 :)

在测试这个插件时我还有另一个条件。我在客户办公室。要访问 CRM 365 On-Premise,他们为我提供了连接 Wi-fi 的用户名和密码。连接此 Wi-Fi 时。我能够访问 CRM 365 On-premise。但我无法连接 CRM Online(无法访问互联网)。同时,在我的插件代码中,我必须连接到 CRM Online 以获取记录。因为当我使用控制台应用程序成功连接时,我使用我的个人 wifi 和互联网连接。这是这个问题的根源吗?

4

1 回答 1

0

如果我理解正确,您说本地 CRM 服务无法访问 Internet。在那种情况下,它如何访问 CRM Online?

我还建议使用 Microsoft.Xrm.Client 库中的简化连接 ( https://msdn.microsoft.com/library/gg695810(v=crm.7).aspx ) 或 XRM 工具 ( https://msdn. microsoft.com/en-us/library/mt608573.aspx)如果您使用的是 CRM 2016。有很多不同的身份验证方案。在线连接到 CRM 是一个完整的身份验证、令牌和重定向链。这些工具可以处理所有这些,您只需提供一个简单的连接字符串。

编辑:示例代码(在 CRM 2016 on-prem 上工作,与 CRM 在线交谈)。

为了使用简化的连接 Client.dll,您需要将其放入服务器 bin(我为快速测试所做的)或 ILMerge 插件与库。已在帐户创建时注册了此示例插件,但可以是任何东西。从远程(CRM Online)系统正确获取了 UserId。

public class TestOnlinePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        CrmConnection conn = CrmConnection.Parse("Url=https://***.crm4.dynamics.com; Username=***; Password=***;");
        IOrganizationService orgService = new OrganizationService(conn);

        WhoAmIRequest req = new WhoAmIRequest();
        WhoAmIResponse resp = (WhoAmIResponse) orgService.Execute(req);

        throw new InvalidPluginExecutionException($"Remote user ID: {resp.UserId}");
    }
}
于 2017-02-16T14:16:16.687 回答