部署插件后的实体更新给出 2147220891 异常 ServiceModel.FaultException1 Xrm.Sdk.OrganizationServiceFault
Entity update after deploying Plugin gives 2147220891 Exception ServiceModel.FaultException1 Xrm.Sdk.OrganizationServiceFault
您好,我已经创建并部署了一个插件。调试代码时使用插件探查器我没有收到任何错误。但是当我更新实体时,会抛出一个错误,这是日志文件:
未处理的异常: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 code aborted the operation.".
您的代码片段不包含完整的 class,但我注意到 Execute 方法引用了一些没有局部作用域的变量:
- 目标实体
- _DC
显然这些变量是属于插件 class 的字段。
Dynamics CRM 实例化插件 classes 一次并在多个线程上重复使用实例。因此,在插件 classes 上使用字段不是线程安全的。
您必须先删除这些字段。
您的插件存在多个其他问题:
- 您的代码确实可以工作,但可能被证明是不必要的。例如。当您的插件正在处理 Create 或 Update 消息时,您不需要检查 Target 参数的存在和类型。
- 最好不要通过项目选择器从实体的属性集合中获取值,因为从 OrganizationService 检索时,数据库中具有
NULL
值的属性不会添加到集合中。请改用方法 GetAttributeValue<T>
。
- dc_AppId 中的值将不包含 Id (
Guid
),而是记录的显示名称 (string
)。另外,它的值不应该传递到 FetchXML 中吗?
- 在您的代码中,您使用的是
targetEntity.Id
属性。对于创建消息,此 属性 将在 PreValidation 和 PreOperation 阶段 return a Guid.Empty
。在 PostOperation 和 AsyncOperation 阶段,可以从 OutputParameters
集合中检索 Id。 (关键是'id'。)
- 您正在使用 FetchXML 查询数据。在 CRM 2011 中,最好改用
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 异步服务(对于异步插件)时,可以使调试更容易。
您好,我已经创建并部署了一个插件。调试代码时使用插件探查器我没有收到任何错误。但是当我更新实体时,会抛出一个错误,这是日志文件:
未处理的异常: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 code aborted the operation.".
您的代码片段不包含完整的 class,但我注意到 Execute 方法引用了一些没有局部作用域的变量:
- 目标实体
- _DC
显然这些变量是属于插件 class 的字段。
Dynamics CRM 实例化插件 classes 一次并在多个线程上重复使用实例。因此,在插件 classes 上使用字段不是线程安全的。
您必须先删除这些字段。
您的插件存在多个其他问题:
- 您的代码确实可以工作,但可能被证明是不必要的。例如。当您的插件正在处理 Create 或 Update 消息时,您不需要检查 Target 参数的存在和类型。
- 最好不要通过项目选择器从实体的属性集合中获取值,因为从 OrganizationService 检索时,数据库中具有
NULL
值的属性不会添加到集合中。请改用方法GetAttributeValue<T>
。 - dc_AppId 中的值将不包含 Id (
Guid
),而是记录的显示名称 (string
)。另外,它的值不应该传递到 FetchXML 中吗? - 在您的代码中,您使用的是
targetEntity.Id
属性。对于创建消息,此 属性 将在 PreValidation 和 PreOperation 阶段 return aGuid.Empty
。在 PostOperation 和 AsyncOperation 阶段,可以从OutputParameters
集合中检索 Id。 (关键是'id'。) - 您正在使用 FetchXML 查询数据。在 CRM 2011 中,最好改用
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 异步服务(对于异步插件)时,可以使调试更容易。