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

