You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:42:28