创建Dynamics CRM插件以执行外部任务

时间:2019-03-14 20:31:45

标签: c# plugins dynamics-crm dynamics-crm-2016

我正在尝试使用CRM插件。我的最终目标是创建一个插件,该插件将运行另一个仅将项目凭据添加到excel文件的程序。对于我的示例项目,我基本上只是遵循https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/tutorial-write-plug-in。这里提供的示例非常好,并且教会了我很多关于插件的知识。我遇到的问题是,每当我尝试执行本教程中未涉及的代码时,都会收到错误消息,并且调试过程甚至没有达到断点。当我从函数中删除个人代码时,它可以正常工作。

public class PostCreateContact : IPlugin
{

    public void Execute(IServiceProvider serviceProvider)
    {


        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        //Process firstProc = new Process();
        //firstProc.StartInfo.FileName = "notepad++.exe";
        //firstProc.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
        //firstProc.EnableRaisingEvents = true;
        //firstProc.Start();
        if (context.InputParameters.Contains("Target")&& context.InputParameters["Target"] is Entity)
        {
            Entity entity = (Entity)context.InputParameters["Target"];
            try
            {
                Entity followup = new Entity("task");
                followup["subject"] = "Send e-mail to the new customer.";
                followup["description"] = "Follow up with the customer. Check if there are any new issues that need resolution.";
                followup["scheduledstart"] = DateTime.Now;
                followup["scheduledend"] = DateTime.Now.AddDays(2);
                followup["category"] = context.PrimaryEntityName;

                if (context.OutputParameters.Contains("id"))
                {
                    Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString());
                    string regardingobjectidType = "contact";
                    followup["regardingobjectid"] = new EntityReference(regardingobjectidType, regardingobjectid);
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    service.Create(followup);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException(ex.Message);
            }
        }
    }
}

我注释掉的5行代码是我提到的我的个人代码。如果我要取消注释那些行。该代码不会达到我的断点。我的断点设置在“ public void Execute(IserviceProver servicerProvider)”行下方。有人可以向我解释为什么当我插入自己的代码来执行与CRM无关的任务时,它立即失败吗?

此外,除了尝试打开记事本++外,尝试抛出消息框也将不起作用。

2 个答案:

答案 0 :(得分:3)

插件的本质是它们在Dynamics 365系统中的数据上运行,或者通过HTTP或HTTPS与外界通信。写入本地文件超出了插件设计的范围。

让插件与外界交流的一种方法是编写Azure-aware plugin

如果您的系统是本地系统,则在the sandbox外部注册您的插件将提供更大的灵活性,即使在本地文件中写入,即使在技术上可行(我也不认为这是可能的)仍然是一个坏习惯。

要以受支持的方式向用户发送文件,可以将其创建为注释附件。完成后,您可以简单地通过电子邮件向用户发送指向Dynamics 365中该注释的链接。

如果您希望文件在Dynamics 365之外可用,则可以触发Azure- 知道其插件是基于Azure的侦听器的插件将检索Note附件文件,将其上传到SharePoint或OneDrive之类的云文件服务,然后通过电子邮件向用户发送文件的链接。

由于即使是沙盒插件也可以使用HTTPS,因此表面上您可以让插件将文件直接上传到外部云主机,但是身份验证可能会很麻烦。而且,根据上传速度和文件大小,您可能会遇到沙盒2分钟超时的情况。

如今,标准做法是假设任何本地系统都可能在某一天联机,因此设计所有代码以在沙箱中运行。

答案 1 :(得分:2)

我将为那些视觉学习更多的人标记Aron的出色答案。从高点看,下面是在CRM中执行常规CRUD操作时发生的情况:enter image description here

取决于您的注册方式,插件本身会在第2步或第4步中执行,但是无论如何,它都是在与正在处理的云中计算机上的所有其他进程隔离的在线沙箱进程中执行的它。沙箱对您的代码施加了其他限制,其中之一就是磁盘访问权限。您无法从插件访问硬盘驱动器的任何部分,因此尝试读取或写入文件将失败。尝试打开一个应用程序没有任何意义,因为即使允许,它也会在Microsoft云中某个Webfarm中的某个Web服务器上打开,而不是在本地计算机上打开。