dynamics-crm - 如何安全地忽略 Dynamics CRM 插件中的错误?

标签 dynamics-crm dynamics-crm-2013

我在执行某些操作的自定义实体的创建(同步、操作后)上注册了一个 CRM 插件,并且我希望创建操作能够成功,尽管插件中存在错误。出于性能原因,我还希望插件在创建记录时立即触发,因此不希望使插件异步。我通过执行以下操作来实现此目的:

public class FooPlugin : IPlugin
{
    public FooPlugin(string unsecureInfo, string secureInfo) { }

    public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            // Boilerplate
            var context = (IPluginExecutionContext) serviceProvider.GetService(typeof (IPluginExecutionContext));
            var serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof (IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            // Additional validation omitted
            var targetEntity = (Entity) context.InputParameters["Target"];

            UpdateFrobber(service, (EntityReference)targetEntity["new_frobberid"]);
            CreateFollowUpFlibber(service, targetEntity);
            CloseTheEntity(service, targetEntity);
        }
        catch (Exception ex)
        {
            // Send an email but do not re-throw the exception 
            // because we don't want a failure to roll-back the transaction.
            try
            {
                SendEmailForException(ex, context);
            }
            catch { }
        }
    }
}

但是,当发生错误时(例如在 UpdateFrobber(...) 中),服务客户端会收到此异常:

System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: 
There is no active transaction. This error is usually caused by custom plug-ins
that ignore errors from service calls and continue processing.

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ref ProxyRpc rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref MessageData msgData, Int32 type)
   at Microsoft.Xrm.Sdk.IOrganizationService.Create(Entity entity)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.CreateCore(Entity entity)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Create(Entity entity)
   at Microsoft.Xrm.Client.Services.OrganizationService.<>c__DisplayClassd.<Create>b__c(IOrganizationService s)
   at Microsoft.Xrm.Client.Services.OrganizationService.InnerOrganizationService.UsingService(Func`2 action)
   at Microsoft.Xrm.Client.Services.OrganizationService.Create(Entity entity)
   at MyClientCode() in MyClientCode.cs: line 100

我的猜测是,发生这种情况是因为 UpdateFrobber(...) 使用从插件派生的 IOrganizationService 实例,因此它进行的任何 CRM 服务调用都会参与与插件相同的事务,并且如果这些“子”操作失败,则会导致整个事务回滚。它是否正确?是否有一种“安全”的方法来忽略同步插件中“子”操作的错误?也许是一种实例化 IOrganizationService 实例但不重用插件上下文的方法?

如果相关的话,我们正在本地运行 CRM 2013。

最佳答案

当您的插件参与数据库事务时,您不能忽略子插件中未处理的异常。

但是,当您的插件在部分信任模式下在本地运行时,您实际上可以创建自己的 OrganizationServiceProxy 实例并使用它来访问 CRM。确保引用插件正在执行的服务器以避免“双跳”问题。

关于dynamics-crm - 如何安全地忽略 Dynamics CRM 插件中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29099795/

相关文章:

dynamics-crm-2011 - 如何在 CRM 2011 中向表单添加外部链接?

c# - 集成到 Microsoft Dynamic CRM 2011

c# - 使用 Web 服务更新 Dynamics CRM 中的 StateCode 失败

javascript - CRM 2013 查找中的 addCustomView

javascript - 当 Dynamics CRM 2013 中保存操作失败时,如何在客户端获取错误详细信息?

dynamics-crm - Microsoft Dynamics CRM 2013 和 TFS 2013 的集成

dynamics-crm - Microsoft CRM 和 xRM 之间的差异

ruby-on-rails - 使用 REST API 从 Dynamics CRM 导入数据

dynamics-crm-2011 - 如何允许 CRM 插件处理多个事件消息

javascript - CRM - 从另一个表单中检索选定的选项集