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

如何使用DiscoveryWebProxyClient类调用Dynamics 365 Web服务(OAuth认证)

我来帮你梳理下如何用DiscoveryWebProxyClient结合OAuth认证调用Dynamics 365 Web服务,结合你已有的令牌代码来一步步实现:

使用DiscoveryWebProxyClient调用Dynamics 365 Web服务(OAuth认证)

1. 先修正你现有令牌获取代码的小问题

你的代码里有两处细节错误,先调整成可用的异步版本(同步方法已逐步被弃用,推荐用异步):

// 替换成你的实际参数
string tenantId = "你的租户ID";
string clientId = "你的应用Client ID";
string clientSecret = "你的应用Client Secret";
string dynamicsBaseUrl = "https://你的Dynamics实例.crm.dynamics.com";

// 修正AuthenticationContext的URL格式,修正拼写错误ClinetSecret→ClientSecret
AuthenticationContext authContext = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}");
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

// 异步获取令牌,避免线程阻塞
AuthenticationResult authResult = await authContext.AcquireTokenAsync(dynamicsBaseUrl, clientCred);
string accessToken = authResult.AccessToken;

2. 用DiscoveryWebProxyClient获取组织服务端点

DiscoveryWebProxyClient的核心作用是自动发现Dynamics 365的组织服务元数据与有效端点,适合不确定具体服务URL的场景,步骤如下:

2.1 初始化Discovery客户端

需要指定Discovery服务的标准URL(注意版本号要匹配你的Dynamics实例,比如v9.2):

// Discovery服务URL格式:https://[实例名].api.crm.dynamics.com/api/discovery/[版本]/
string discoveryServiceUrl = "https://你的Dynamics实例.api.crm.dynamics.com/api/discovery/v9.2/";

// 创建客户端实例,并设置OAuth令牌
DiscoveryWebProxyClient discoveryClient = new DiscoveryWebProxyClient(new Uri(discoveryServiceUrl), false);
discoveryClient.HeaderToken = accessToken;

2.2 获取目标组织的服务端点

通过Discovery服务可以拿到当前租户下的所有组织信息,筛选出你要操作的组织后,提取其组织服务URL:

// 获取租户下所有组织
OrganizationCollection orgCollection = discoveryClient.DiscoverOrganizations();

// 根据组织名称或唯一名称筛选目标组织
OrganizationDetail targetOrg = orgCollection.Organizations
    .FirstOrDefault(o => o.FriendlyName == "你的组织显示名称");

// 提取组织服务的端点URL
string orgServiceUrl = targetOrg.Endpoints[EndpointType.OrganizationService];

3. 用OrganizationWebProxyClient执行实际业务操作

拿到组织服务URL后,就可以用OrganizationWebProxyClient调用Dynamics 365的核心API了,比如执行查询、创建记录等:

using (OrganizationWebProxyClient orgServiceClient = new OrganizationWebProxyClient(new Uri(orgServiceUrl), false))
{
    // 传入之前获取的OAuth令牌
    orgServiceClient.HeaderToken = accessToken;

    // 示例1:执行WhoAmI验证连接
    WhoAmIRequest whoAmIReq = new WhoAmIRequest();
    WhoAmIResponse whoAmIRes = (WhoAmIResponse)await orgServiceClient.ExecuteAsync(whoAmIReq);
    Console.WriteLine($"当前登录用户ID: {whoAmIRes.UserId}");

    // 示例2:创建一条账户记录
    Entity account = new Entity("account");
    account["name"] = "测试OAuth账户";
    account["telephone1"] = "13800138000";

    Guid newAccountId = await orgServiceClient.CreateAsync(account);
    Console.WriteLine($"新建账户ID: {newAccountId}");
}

4. 关键注意事项

  • NuGet依赖:确保你已经安装了Microsoft.CrmSdk.WebServiceClient包,这个包包含DiscoveryWebProxyClient和OrganizationWebProxyClient类。
  • 权限配置:在Azure AD注册的应用必须被授予Dynamics 365的对应权限(比如应用权限里的Dynamics 365 Customer Service权限),同时要在Dynamics 365后台给应用用户分配安全角色。
  • 版本匹配:Discovery服务的版本号(比如v9.2)要和你的Dynamics实例版本一致,否则会出现兼容性错误。
  • 异常处理:实际代码中要捕获AdalException(令牌获取失败)、FaultException(Dynamics服务调用失败)等异常,提升代码健壮性。

内容的提问来源于stack exchange,提问作者SandeepKP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:26