部署插件后的实体更新2147220891异常服务模型.FaultException1 Xrm.Sdk.Organizat



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

未处理的异常: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 代码中止了操作。

您的代码片段不包含完整的类,但我注意到 Execute 方法引用了一些没有本地范围的变量:

  • 目标实体
  • _直流

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

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

您必须先删除这些字段。

您的插件显示多个其他问题:

  1. 您的代码确实可以证明是不必要的工作。 例如,当您的插件处理创建或更新消息时,您无需检查 Target 参数的存在和类型。
  2. 实体的属性集合中获取值最好不要通过项目选择器完成,因为在从 OrganizationService 检索时,不会将数据库中具有NULL值的属性添加到集合中。请改用方法 GetAttributeValue<T>
  3. dc_AppId中的值将不包含 Id ( Guid ),而是记录的显示名称 ( string )。另外,它的值不应该传递到 FetchXML 中吗?
  4. 在代码中,使用 targetEntity.Id 属性。对于"创建"消息,此属性将在预验证和预操作阶段返回Guid.Empty。在"后操作"和"异步操作"阶段,可以从OutputParameters集合中检索 Id。(键是"id"。
  5. 您正在使用 FetchXML 来查询数据。在 CRM 2011 中,最好改用QueryExpression(或 Linq-query)。在插件中,您只需要 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 异步服务(对于异步插件)时,可以使调试更容易。

最新更新