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

Creating Dynamics CRM Plugin to execute external task

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

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 无关的任务时它立即失败吗?

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

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

让插件与外界通信的一种方法是编写一个 Azure-aware plugin.

如果您的系统是内部部署的,在 the sandbox 外部注册您的插件将提供更大的灵活性,尽管写入本地文件,即使这在技术上是可行的(我不相信) is) 仍然是一种不好的做法。

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

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

由于即使是沙盒插件也可以使用 HTTPS,您表面上可以让插件将文件直接上传到外部云主机,但身份验证可能会很棘手。而且,根据上传速度和文件大小,您可以 运行 对抗沙箱的 2 分钟超时。

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

对于那些视觉学习者,我会在 Aron 的出色回答上加上标签。下面的高点是在 CRM 中执行正常的 CRUD 操作时发生的情况:

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