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

如何在Dynamics 365的.NET插件中获取环境上下文并调用数据

在Dynamics 365 .NET插件中无需硬编码URL发起数据请求

你可以通过两种方式实现类似PCF中webAPI的无硬编码数据请求能力,优先推荐使用Dynamics原生的IOrganizationService接口,它能自动适配任意环境,无需手动处理URL和身份验证。

一、使用IOrganizationService(官方推荐方案)

.NET插件中不需要直接拼接Web API URL,通过插件上下文获取的IOrganizationService是官方标准的数据操作接口,功能和PCF的webAPI一致,且完全适配所有Dynamics环境。

以下是对应你PCF代码的示例,实现获取指定字段的lead列表:

用QueryExpression实现(对应OData查询)

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

public class LeadRetrievalPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        // 获取插件执行上下文
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        // 创建组织服务实例
        var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var orgService = serviceFactory.CreateOrganizationService(context.UserId);

        // 构造查询,对应PCF中的"lead?$select=address1_county,leadid"
        var leadQuery = new QueryExpression("lead")
        {
            ColumnSet = new ColumnSet("address1_county", "leadid")
        };

        // 执行查询并获取结果
        var leads = orgService.RetrieveMultiple(leadQuery);

        // 处理返回的数据
        foreach (var lead in leads.Entities)
        {
            var county = lead.GetAttributeValue<string>("address1_county");
            var leadId = lead.Id;
            // 在这里添加你的业务逻辑
        }
    }
}

用FetchXML实现(如果偏好XML查询语法)

如果你更习惯用FetchXML,也可以直接构造查询语句:

// 构造对应字段选择的FetchXML
var fetchXml = @"
<fetch>
  <entity name='lead'>
    <attribute name='address1_county' />
    <attribute name='leadid' />
  </entity>
</fetch>";

// 执行FetchXML查询
var leads = orgService.RetrieveMultiple(new FetchExpression(fetchXml));

二、直接调用Web API(特殊场景需求)

如果因业务场景必须直接调用Web API,可以通过插件上下文获取环境的根URL,无需硬编码:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.Net.Http;
using System.Net.Http.Headers;

public class LeadWebApiPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        
        // 获取环境的根URL
        var orgConfig = serviceFactory.CreateOrganizationService(null).GetConfiguration();
        var orgRootUrl = orgConfig.ServiceUri.AbsoluteUri;
        var webApiRoot = $"{orgRootUrl.TrimEnd('/')}/api/data/v9.2/";

        // 获取当前用户的访问令牌
        var accessToken = context.SharedVariables["OAuthToken"]?.ToString();
        // 若使用早期绑定服务,也可通过以下方式获取令牌:
        // var proxy = (OrganizationServiceProxy)serviceFactory.CreateOrganizationService(context.UserId);
        // var accessToken = proxy.SecurityTokenResponse.AccessToken;

        // 发起OData请求
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // 对应PCF中的请求路径
            var requestUrl = $"{webApiRoot}lead?$select=address1_county,leadid";
            var response = client.GetAsync(requestUrl).Result;

            if (response.IsSuccessStatusCode)
            {
                var jsonData = response.Content.ReadAsStringAsync().Result;
                // 解析JSON并处理业务逻辑
            }
        }
    }
}

注意事项

  • 优先使用IOrganizationService,它会自动处理身份验证、环境适配、版本兼容等问题,比直接调用Web API更稳定高效。
  • 若使用Web API,注意控制HttpClient的实例化频率,避免资源泄漏;插件中同步执行时需用.Result而非await,异步插件除外。

内容的提问来源于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:15:47