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

时间:2015-01-21 23:40:40

标签: dynamics-crm-2011 dynamics-crm microsoft-dynamics

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

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

-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;
        }
    }

请帮助!!!

1 个答案:

答案 0 :(得分:4)

您可以在CRM SDK中查找错误代码(-2147220891)。在帮助文件中搜索Web服务错误代码。代码采用十六进制格式。你的是0x80040265,“ISV代码中止了操作。”。

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

  • targetEntity
  • _DC

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

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

您必须先删除这些字段。

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

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

        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异步服务(用于异步插件)时,可以使调试更容易。