【问题标题】:Simple Update Plugin timing out简单更新插件超时
【发布时间】:2015-05-08 02:58:05
【问题描述】:

我有一个插件可以更新实体上的一个字段,它也会触发更新。我正在尝试检查状态是否更改为“已计划”并已保存,那么某些文档类型必须存在于 Sharepoint 中。来自 Sharepoint 的数据被立即检索。问题是插件耗时太长或抛出错误: UnhandledException:System.ServiceModel.FaultException:需要在commitDetail之前启动一个事务:ErrorCode:-2147220911

请查看提供的代码并帮助我...

void IPlugin.Execute(IServiceProvider serviceProvider) { IPluginExecutionContext 上下文 = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if(context.MessageName != "更新") 返回;

        Entity targetEntity = context.InputParameters["Target"] as Entity;
        if(targetEntity.LogicalName != "new_Smiley")
            return;

        //if(context.Depth > 1)
        //    return;

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

        try {
            _TracingService.Trace("About to Retrieve Smiley entity");
            Entity _Smiley = service.Retrieve("new_Smiley", targetEntity.Id, new ColumnSet(
                            "new_applicationtonew_Smileyid",
                            "new_new_Smileyidnumber",
                            "new_status",
                            "new_ppoSmileyid"
                        ));

            var Smiley_AppId = _Smiley.GetAttributeValue<EntityReference>("new_applicationtonew_Smileyid");
            if(Smiley_AppId == null)
                return;
            var SmileyId = _Smiley.GetAttributeValue<string>("new_new_Smileyidnumber");
            var SmileyStatus = _Smiley.GetAttributeValue<OptionSetValue>("new_status").Value;
            //if(!(SmileyStatus == 649770001 || new_SmileyStatus == 649770000)) {
            //    return;
            //}
            //var PPOId = _Smiley.GetAttributeValue<EntityReference>("new_ppoSmileyid").Name;
            var PPOGuid = _Smiley.GetAttributeValue<EntityReference>("new_ppoSmileyid").Id;
            _TracingService.Trace("About to Retrieve entity");
            Entity _PPO = service.Retrieve("new_ppo", PPOGuid, new ColumnSet("new_pathwayselected"));
            var PPOPathway = _PPO.GetAttributeValue<OptionSetValue>("new_pathwayselected").Value;

            _TracingService.Trace("Retrieved Smiley entity {0}...", SmileyId);
            GetSPList spList = new GetSPList();
            var liSPDocTypes = spList.GetList(SmileyId);
            foreach(var item in liSPDocTypes) {
                _TracingService.Trace(item + " ;");
            }

            Entity PreImage = (Entity)context.PreEntityImages["PreUpdateImage"];
            //Entity PostImage = (Entity)context.PostEntityImages["PostEntityImage"];
            //if(PostImage.Contains("new_status")) {
                //throw new InvalidPluginExecutionException(PreImage.GetAttributeValue<OptionSetValue>("new_status").Value.ToString() + "_" + PostImage.GetAttributeValue<OptionSetValue>("new_status").Value.ToString());
            //}

            var liJODocTypes = new List<string>() { "Type1", "Type2", "Type3", "Type4" };
            var liScopeDocTypes = new List<string>() { "Type5", "Type6", "Type7", "Type8" };

            if(SmileyStatus == 649770001) {
                foreach(var doctype in liJODocTypes) {
                    //if(liSPDocTypes.Contains(doctype) && (PPOPathway == 100000000 || PPOPathway == 649770000 || PPOPathway == 100000001)) {
                    if(liSPDocTypes.Contains(doctype)) {
                        service.Update(_Smiley);
                    }
                    else {
                        throw new InvalidPluginExecutionException();
                    }
                }
            }

            //if(context.Depth > 1)
            //    return;
        }

        catch(InvalidPluginExecutionException ex) {
            _TracingService.Trace("{0}", ex.ToString() + "_" + ex.StackTrace + " Error by Tracing Service");
            throw new InvalidPluginExecutionException("Please upload all required documents...");
        }
        catch(FaultException<OrganizationServiceFault> ex) {
            _TracingService.Trace("The application terminated with an error.");
            _TracingService.Trace("Timestamp: {0}", ex.Detail.Timestamp);
            _TracingService.Trace("Code: {0}", ex.Detail.ErrorCode);
            _TracingService.Trace("Message: {0}", ex.Detail.Message);
            _TracingService.Trace("Inner Fault: {0}",
                null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
        }
        catch(TimeoutException ex) {
            _TracingService.Trace("The application terminated with an error.");
            _TracingService.Trace("Message: {0}", ex.Message);
            _TracingService.Trace("Stack Trace: {0}", ex.StackTrace);
            _TracingService.Trace("Inner Fault: {0}",
                null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message);
        }
        catch(Exception ex) {
            _TracingService.Trace("Update: {0}", ex.ToString() + ex.StackTrace);
        }
    }
}

在插件注册工具中,我已经注册了事件插件:预操作(CRM 2011),同步。

我可能做错了什么。请建议我是否必须使用 PreImages 或错误地注册插件。 如果需要更多信息,请告诉我... 谢谢!

【问题讨论】:

  • GetSPList 是什么对象?它是否访问 CRM 或远程资源?
  • GetSPList 正在使用其 Web 服务从 Sharepoint 的列中获取文档类型(例如:租赁协议、合同...)作为列表。
  • 该操作是否超时? (顺便说一句,您的插件是否保持状态,即它是否有字段?)
  • 我使用了一个控制台应用程序,从 Sharepoint 检索时速度很快。只要插件没有命中 service.update,它就可以工作。我已经解决了这个问题,而且更符合逻辑。我正在使用 PostImage 来检查状态值,如果上传了所需的文档类型,则什么也不做(没有 service.update.. 让服务调用通过),如果缺少 req 文档,则抛出新的 InvalidPluginExecutionException(“请检查一些文档是失踪...”);谢谢 Henk.. 你总是出现 CRM 问题:)

标签: dynamics-crm-2011


【解决方案1】:

在插件中这将是有问题的代码:

catch(FaultException<OrganizationServiceFault> ex) {
        _TracingService.Trace("The application terminated with an error.");
        _TracingService.Trace("Timestamp: {0}", ex.Detail.Timestamp);
        _TracingService.Trace("Code: {0}", ex.Detail.ErrorCode);
        _TracingService.Trace("Message: {0}", ex.Detail.Message);
        _TracingService.Trace("Inner Fault: {0}",
            null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
    }

当您的代码吞下 FaultException 时,它会中断事务并且通常(我会说总是)导致该错误。

您需要查看正在捕获的跟踪详细信息,以了解导致初始 FaultException 的原因。

在我用于插件的通用错误处理代码中,我总是在捕获 FaultException 后抛出 InvalidPluginExecutionException,因为一旦发生,事务成功完成的可能性很小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2010-10-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2013-04-09
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多