Dynamics 365 C#插件用FetchXML触发Object reference空引用错误
问题描述
我正在用C#开发Dynamics 365插件,尝试通过FetchXML发起数据查询请求时,遇到错误:Object reference not set to an instance of an object.。以下是我的代码:
public void Execute(IServiceProvider serviceProvider) { // Obtain the tracing service ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); // Obtain the execution context from the service provider. IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationService svc = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService)); try { var id = context.InputParameters["leadid"] as string; var fetchXml = $@"<?xml version=""1.0"" encoding=""utf-16""?> <fetch> <entity name=""lead""> <attribute name=""leadid"" /> <link-entity name=""new_sitecorevisit"" from=""new_new_parent_leadid"" to=""leadid""> <attribute name=""new_visitduration"" /> <filter> <condition attribute=""new_new_parent_leadid"" operator=""eq"" value=""{id}"" /> </filter> </link-entity> </entity> </fetch>"; EntityCollection result = svc.RetrieveMultiple(new FetchExpression(fetchXml)); context.OutputParameters["data"] = result; } catch (Exception ex) { tracingService.Trace("Error: {0}", ex.ToString()); throw; } }
我认为错误出现在EntityCollection result = svc.RetrieveMultiple(new FetchExpression(fetchXml));这一行,移除该行后问题消失。我已检查过fetchXml变量和id变量,均无异常;且通过JavaScript调用可正常获取数据,但这对.NET插件开发无用。请问我哪里出错了?
解决方案
1. 修正IOrganizationService实例获取方式
直接通过serviceProvider.GetService(typeof(IOrganizationService))获取服务会返回null,正确流程是先获取服务工厂再创建实例:
// 替换原有的svc获取代码 IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService svc = serviceFactory.CreateOrganizationService(context.UserId);
2. 修复FetchXML格式问题
C#字符串模板中无需转义XML标签,直接使用<>即可,同时建议将编码改为utf-8避免兼容性问题:
var fetchXml = $@"<?xml version=""1.0"" encoding=""utf-8""?> <fetch> <entity name=""lead""> <attribute name=""leadid"" /> <link-entity name=""new_sitecorevisit"" from=""new_new_parent_leadid"" to=""leadid""> <attribute name=""new_visitduration"" /> <filter> <condition attribute=""new_new_parent_leadid"" operator=""eq"" value=""{leadId.ToString()}"" /> </filter> </link-entity> </entity> </fetch>";
3. 修正LeadId类型转换
leadid在Dynamics 365中是Guid类型,不能直接用as string转换,需做安全校验:
// 替换原有的id获取代码 Guid leadId; if (!context.InputParameters.TryGetValue("leadid", out var leadIdObj) || !(leadIdObj is Guid)) { tracingService.Trace("leadid参数缺失或类型错误"); throw new InvalidPluginExecutionException("无效的leadid参数"); } leadId = (Guid)leadIdObj;
4. 调整输出参数赋值
插件输出参数不支持直接传入EntityCollection,改为传入实体列表:
context.OutputParameters["data"] = result.Entities;
内容的提问来源于stack exchange,提问作者dwewers
相关产品推荐
相关产品推荐

