我有一个插件,更新了实体上的一个字段,也触发了更新。我正在尝试检查状态是否更改为'Scheduled‘并保存,那么Sharepoint中一定存在某些文档类型。从Sharepoint检索数据不会有任何延迟。问题是插件耗时过长或抛出错误: UnhandledException:System.ServiceModel.FaultException:需要在commitDetail: ErrorCode:-2147220911之前启动事务
请看提供的代码,并帮助我...
(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));context (IServiceProvider serviceProvider) { IPluginExecutionContext context= void 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);
}
}
}在插件注册工具中,我已经为事件注册了插件: Pre-operation(CRM 2011),Synchronous。
如果我必须使用PreImages或者不正确地注册插件,我可能会做一些wrong.Please建议的事情。如果需要更多信息,请告诉我。谢谢!
发布于 2015-05-08 02:58:06
在插件中,这将是有问题的代码:
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,因为一旦发生FaultException,事务成功完成的机会就很小。
https://stackoverflow.com/questions/30087969
复制相似问题