gpt4 book ai didi

c# - Dynamics CRM 2011 - 阻止通过插件创建实体

转载 作者:太空狗 更新时间:2023-10-29 22:27:07 24 4
gpt4 key购买 nike

问题:我们使用 CRM for Outlook 插件自动记录我们的支持电子邮件,但员工之间的内部电子邮件(其中一些包含敏感信息)也会被记录。

理想的解决方案:我正在尝试编写一个事件前(“创建电子邮件”消息)插件来阻止内部电子邮件的自动记录,但(显然)这是停止被执行的消息是在事件前阶段抛出异常,但这总是导致在 outlook 中显示错误消息(我们显然不能拥有)。根据文档,只有“InvalidPluginExecutionExeception”应该向用户显示消息,但事实并非如此,因为所有异常都会导致用户的 Outlook 应用程序中出现错误消息。

可能的解决方案:还有一条“CheckPromoteEmail”消息(根据文档)确定是否应将电子邮件提升到 CRM(我假设“提升到 CRM”的意思是“使电子邮件实体存储在 CRM 中”),但我在上下文中找不到任何可以让我告诉 CRM 不要推广电子邮件的内容。是否有一些标记隐藏在我可以设置的上下文中,或者是否有某种方法来使电子邮件无效,以便 CRM 自己的逻辑决定不存储它?

变通解决方案: 我知道的唯一其他解决方案(提到 here )只是在创建电子邮件后清除电子邮件的主题和内容,但我宁愿停止从一开始就创建电子邮件,而不是在创建电子邮件浪费时间和资源后编辑或删除它。

有没有一种干净的方法可以从插件停止操作?或者从任何地方?如果没有,有谁知道微软为什么不提供这个功能?他们已经在后台提供了可靠的回滚功能,以防操作失败,他们为什么不给我一个调用回滚的方法?

如果它有助于回答我的问题,这是我的代码:

public class InternalEmailFilter : IPlugin
{
void IPlugin.Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext _context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity e = (Entity)_context.InputParameters["Target"];
bool shouldStore = ShouldStoreInCRM(e);

if (shouldStore == false)
{
throw new Exception(); //attempting to stop the operation without an InvalidPluginExecutionException, but still results in error message to user
}
}

protected bool ShouldStoreInCRM(Entity e)
{

List<Entity> parties = new List<Entity>();

var atttributes = e.Attributes;
if (atttributes.ContainsKey("to") == true) parties.AddRange((atttributes["to"] as EntityCollection).Entities);
if (atttributes.ContainsKey("from") == true) parties.AddRange((atttributes["from"] as EntityCollection).Entities);
if (atttributes.ContainsKey("cc") == true) parties.AddRange((atttributes["cc"] as EntityCollection).Entities);
if (atttributes.ContainsKey("bcc") == true) parties.AddRange((atttributes["bcc"] as EntityCollection).Entities);

foreach (Entity p in parties)
{
if (p.LogicalName == "activityparty" && p.Attributes.ContainsKey("addressused") == true && p.Attributes["addressused"] != null)
{
if (p.Attributes["addressused"].ToString().ToLower().Contains("@ourdomain.com") == false)
{
return true; //someone connected in the email is not an employee, store the email
}
}
}

return false; //everyone was an employee, do not store
}
}

最佳答案

经过大量的血汗和泪水,我终于想出了如何做到这一点:

您必须在“创建电子邮件”消息上使用异步后事件插件,以便在创建电子邮件后使用 CRMService 从数据库中删除电子邮件。它必须是异步的,因为您需要等待 CRM 完成创建并“释放”实体,然后才能删除它。否则,进程挂起。

这些解决方案中的任何一个都会更好,但作为引用,您不能:

  1. 在预事件中抛出异常以取消创建/推广电子邮件操作,而不会向用户显示错误消息或对他们的 Outlook 造成严重破坏。尽管只有 InvlaidPluginExectuionExecption 应该向用户显示消息,但所有异常都会向用户显示错误消息。
  2. 阻止向 CRM 发送电子邮件。 CheckPromoteEmail 消息预事件(令人惊讶地)没有提供有关可能被提升的消息的信息(因此没有数据可用于决定是否应该提升消息)并且没有任何可用于告诉 CRM 不提升消息的信息。而且,如果您使用前/后事件并尝试使用输出参数并更改那里的 ShouldPromote 标志,它什么也不做。
  3. 在为其创建实体之前清除电子邮件的正文内容 - 您在事件前对正文内容所做的任何更改都不会保留在执行上下文中,并且在核心操作开始。

令人抓狂。

关于c# - Dynamics CRM 2011 - 阻止通过插件创建实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14696441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com