我正在尝试使用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无关的任务时,它立即失败吗?
此外,除了尝试打开记事本++外,尝试抛出消息框也将不起作用。
答案 0 :(得分:3)
插件的本质是它们在Dynamics 365系统中的数据上运行,或者通过HTTP或HTTPS与外界通信。写入本地文件超出了插件设计的范围。
让插件与外界交流的一种方法是编写Azure-aware plugin。
如果您的系统是本地系统,则在the sandbox外部注册您的插件将提供更大的灵活性,即使在本地文件中写入,即使在技术上可行(我也不认为这是可能的)仍然是一个坏习惯。
要以受支持的方式向用户发送文件,可以将其创建为注释附件。完成后,您可以简单地通过电子邮件向用户发送指向Dynamics 365中该注释的链接。
如果您希望文件在Dynamics 365之外可用,则可以触发Azure- 知道其插件是基于Azure的侦听器的插件将检索Note附件文件,将其上传到SharePoint或OneDrive之类的云文件服务,然后通过电子邮件向用户发送文件的链接。
由于即使是沙盒插件也可以使用HTTPS,因此表面上您可以让插件将文件直接上传到外部云主机,但是身份验证可能会很麻烦。而且,根据上传速度和文件大小,您可能会遇到沙盒2分钟超时的情况。
如今,标准做法是假设任何本地系统都可能在某一天联机,因此设计所有代码以在沙箱中运行。
答案 1 :(得分:2)