如何通过Dynamics CRM 365内部部署中的插件检索CRM Online中的记录

时间:2017-02-16 07:44:16

标签: c# dynamics-crm dynamics-crm-online dynamics-crm-365

我需要创建在CRM Online中检索记录的插件。此插件将在Dynamics CRM 365内部部署中注册。我已经尝试了所有我知道的创建这个插件,也在互联网上搜索教程。但是,每次我测试插件。它总是说

"元数据包含无法解析的引用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内部部署,他们会为我提供用于连接Wi-Fi的用户名和密码。连接这个Wi-Fi时。我能够访问CRM 365内部部署。但我无法连接CRM Online(无法访问互联网)。同时,在我的插件代码中,我必须连接到CRM Online才能获取记录。因为当我使用控制台应用程序成功连接时,我使用我的个人wifi与互联网连接。这是这个问题的根源吗?

1 个答案:

答案 0 :(得分:0)

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

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

编辑: 示例代码(在CRM 2016上工作,在线与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}");
    }
}