部署插件后的实体更新给出 2147220891 异常 ServiceModel.FaultException1 Xrm.Sdk.OrganizationServiceFault

Entity update after deploying Plugin gives 2147220891 Exception ServiceModel.FaultException1 Xrm.Sdk.OrganizationServiceFault

您好,我已经创建并部署了一个插件。调试代码时使用插件探查器我没有收到任何错误。但是当我更新实体时,会抛出一个错误,这是日志文件:

未处理的异常:System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: 下载详细信息并加载使用插件分析器。

-2147220891

找不到解决方案,我在我的插件中评论了所有内容,这里是代码的基本框架,但我仍然遇到错误。

插件代码片段:

public void Execute(IServiceProvider serviceProvider) {
        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

        if(context.MessageName != "Update")
            return;

        var targetEntity = (Entity)context.InputParameters["Target"];

        if(targetEntity.LogicalName != "new_d")
            return;

        ITracingService _TracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
        IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

        try {

        }
        catch(FaultException<OrganizationServiceFault> ex) {
            _TracingService.Trace(ex.ToString());
            throw new InvalidPluginExecutionException("An error occurred in Update plug-in.", ex);
        }
        catch(Exception ex) {
            _TracingService.Trace("Update: {0}", ex.ToString());
            throw;
        }
    }

请帮忙!!!

您可以在CRM SDK中查找错误代码(-2147220891)。在帮助文件中搜索 Web 服务错误代码。代码采用十六进制格式。你的是 0x80040265,"ISV code aborted the operation.".

您的代码片段不包含完整的 class,但我注意到 Execute 方法引用了一些没有局部作用域的变量:

  • 目标实体
  • _DC

显然这些变量是属于插件 class 的字段。

Dynamics CRM 实例化插件 classes 一次并在多个线程上重复使用实例。因此,在插件 classes 上使用字段不是线程安全的。

您必须先删除这些字段。

您的插件存在多个其他问题:

  1. 您的代码确实可以工作,但可能被证明是不必要的。例如。当您的插件正在处理 Create 或 Update 消息时,您不需要检查 Target 参数的存在和类型。
  2. 最好不要通过项目选择器从实体的属性集合中获取值,因为从 OrganizationService 检索时,数据库中具有 NULL 值的属性不会添加到集合中。请改用方法 GetAttributeValue<T>
  3. dc_AppId 中的值将不包含 Id (Guid),而是记录的显示名称 (string)。另外,它的值不应该传递到 FetchXML 中吗?
  4. 在您的代码中,您使用的是 targetEntity.Id 属性。对于创建消息,此 属性 将在 PreValidation 和 PreOperation 阶段 return a Guid.Empty。在 PostOperation 和 AsyncOperation 阶段,可以从 OutputParameters 集合中检索 Id。 (关键是'id'。)
  5. 您正在使用 FetchXML 查询数据。在 CRM 2011 中,最好改用 QueryExpression(或 Linq 查询)。在插件中,您只需要 FetchXml 来进行聚合查询(计数、总和、平均值)。
  6. 请注意,只有在抛出异常时才能从插件中检索跟踪。

我在下面的代码片段中对您的插件进行了一些重组:

    public void Execute(IServiceProvider serviceProvider)
    {
        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

        if (context.MessageName != "Create" && context.MessageName != "Update")
            return;

        var targetEntity = (Entity)context.InputParameters["Target"];

        if (targetEntity.LogicalName != "new_designconsultation")
            return;

        ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
        IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

        try
        {
            var dc = service.Retrieve("new_designconsultation", targetEntity.Id,
                new ColumnSet("new_applicationtodesignconsultationid", "unit1apartment"));

            var dc_AppId = dc.GetAttributeValue<EntityReference>("new_applicationtodesignconsultationid");

            if (dc_AppId == null)
                return;

            // TODO: pass dc_AppId.Id into your Fetch XML.

            var fetchURAs = @"
<fetch distinct='true' mapping='logical'> 
<entity name='new_ura'> 
    <attribute name='new_uraid'/> 
    <attribute name='new_name'/> 
    <attribute name='new_app_uraid'/>
    <attribute name='suiteapt'/>
        <filter type='and'> 
            <condition attribute='suiteapt' operator='not-null'/>
        </filter>
    </entity> 
</fetch>";

            EntityCollection _URAs = service.RetrieveMultiple(new FetchExpression(fetchURAs));
            // TODO: continue processing here...
        }

        catch (FaultException<OrganizationServiceFault> ex)
        {
            tracingService.Trace(ex.ToString());
            throw new InvalidPluginExecutionException("An error occurred in Update plug-in.", ex);
        }
        catch (Exception ex)
        {
            tracingService.Trace("Update: {0}", ex.ToString());
            throw;
        }
    }

将 VS 附加到 W3WP 进程或 CRM 异步服务(对于异步插件)时,可以使调试更容易。