在 C# 插件中调用 Dynamics Web API

Call Dynamics Web API in C# Plugin

我在 Microsoft Dynamics 中有一个业务流程来处理新客户端的创建。该过程完成后,我将附加一个工作流,该工作流会启动一个调用插件进行一些自定义处理的操作。我正在按照 this 文章设置此过程。

在我的插件中,我调用了 Dynamics Web API(见下面的代码)。当我点击 responseMessage = client.GetAsync(url).Result; 行时,我的插件退出而没有返回错误。当我在插件注册工具中调试时,插件注册工具崩溃并且必须重新启动。当我查看网络流量时,此调用似乎失败并出现 401 - Unauthorized 错误。

当我从控制台应用程序尝试同样的 HttpClient 调用时,调用成功。我尝试了几种不同的身份验证凭据,但均未成功。我也试过用几种不同的方式调用 GetAsync 函数。此错误与异步或身份验证方法有关吗?我在这里错过了什么?

HttpClient client = new HttpClient(new HttpClientHandler() { Credentials = new NetworkCredential("admin", "password", "DOMAIN") });
client.BaseAddress = new Uri(Helpers.GetSystemUrl(COHEN.APIConnector.Application.Dynamics));
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
client.DefaultRequestHeaders.Add("OData-Version", "4.0");
HttpResponseMessage responseMessage;
string url = "ccseq_clients";

responseMessage = client.GetAsync(url).Result;

更新

我们正在使用 Dynamics 2016 On-Premise。

我们使用 Web API 的原因是此调用发生在我们开发的库中,该库将在多个系统之间进行交互。该库在插件中使用,但也可以在插件外部用于其他应用程序。我们提供的代码示例是库中失败的代码块。我们将代码块直接提取到插件中,以查看错误是否更多地与库或插件相关。

我们注意到 client.GetAsync(url).Result 调用实际上返回了正确的值。我们错过了在我们的网络流量中看到两次调用在第三次成功并返回正确值之前失败的情况(请参见下面的屏幕截图)。奇怪的是,当我们调试这行代码时,跨过导致插件注册工具崩溃的代码行,而网络流量显示我们返回了正确的值。如果我们在这行代码之后设置一个断点,那么插件注册工具就不会崩溃并且我们的响应中有一个正确的值。当我们回到库中而不是直接在插件中进行调试时,这种行为会发生变化。在库中,即使网络流量仍然显示成功响应,无论我们在哪里设置断点,插件注册工具总是在命中此行时崩溃。


更新 2

我的库似乎成功地对 Web 进行了多次不同的调用 API 所以我认为问题更多的是插件注册工具无法处理 Web API调用多于调用实际上不起作用。

This blog 声明我们可以通过使用 WebClient 和 DefaultCredentials 使 Web Api 在 CRM 内部部署(非 IFD)插件中工作。

using (WebClient client = new WebClient()) 
{            
    client.UseDefaultCredentials = true;
    byte[] responseBytes = client.DownloadData(new Uri("<your web api url>/accounts(3C2D2712-E43F-E411-9402-005056AB452C)")); 
    string response = Encoding.UTF8.GetString(responseBytes);
    // parse the json response 
}

Make sure you specify the UseDefaultCredentials as true to make the web api call under the context of the user the plugin is running.

由于沙盒 + Adal 库 + AAD 令牌组合,我们可能会在使用在线插件时遇到更多困难,因为我们正在尝试非交互式插件代码,这与我们可以通过提示挑战用户的其他界面不同。

此外,Web api 对于跨平台、外部 CRM 上下文集成更有用。在平台执行内部你可以使用Org服务来实现更多。

我认为问题出在分析插件执行的插件注册工具上。我的后续问题是 .