如何在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
相关产品推荐
相关产品推荐

