您好我已经创建并部署了一个插件。在调试代码时使用插件分析器我没有收到任何错误。但是当我更新实体时,会抛出一个错误,这里是日志文件:
未处理的异常: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;
}
}
请帮助!!!
答案 0 :(得分:4)
您可以在CRM SDK中查找错误代码(-2147220891)。在帮助文件中搜索Web服务错误代码。代码采用十六进制格式。你的是0x80040265,“ISV代码中止了操作。”。
您的代码段不包含完整的类,但我注意到Execute方法引用了一些没有本地范围的变量:
显然,这些变量是属于插件类的字段。
Dynamics CRM实例化插件类一次,并在多个线程上重用实例。因此,在插件类上使用字段不是线程安全的。
您必须先删除这些字段。
您的插件会显示其他多个问题:
NULL
值的属性将不会添加到集合中。请改用方法GetAttributeValue<T>
。Guid
),而是包含记录的显示名称(string
)。另外,它的值是不是应该传递给FetchXML?targetEntity.Id
属性。对于Create消息,此属性将在PreValidation和PreOperation阶段返回Guid.Empty
。在PostOperation和AsyncOperation阶段,可以从OutputParameters
集合中检索Id。 (关键是'id'。)QueryExpression
(或Linq查询)。在插件中,只需要FetchXml进行聚合查询(计数,求和,平均)。我在下面的代码段中重新构建了您的插件:
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异步服务(用于异步插件)时,可以使调试更容易。