簡體   English   中英

在C#插件中調用Dynamics Web API

[英]Call Dynamics Web API in C# Plugin

我在Microsoft Dynamics中有一個業務流程來處理新客戶端的創建。 當該過程完成時,我附加了一個工作流,該工作流可以調用插件來執行一些自定義處理。 我正在按照這篇文章來設置這個過程。

在我的插件中,我調用了Dynamics Web API(請參閱下面的代碼)。 當我點擊responseMessage = client.GetAsync(url).Result; line,我的插件退出而不返回錯誤。 當我在插件注冊工具中調試時,插件注冊工具崩潰並且必須重新啟動。 當我查看網絡流量時,此呼叫似乎失敗了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內部部署。

我們使用Web API的原因是這個調用發生在我們開發的庫中,它將在多個系統之間進行接口。 該庫在插件中使用,但也可以在插件之外用於其他應用程序。 我們提供的代碼示例是庫中失敗的代碼塊。 我們將大量代碼直接插入到插件中,以查看錯誤是否與庫或插件有關。

我們注意到client.GetAsync(url).Result調用實際上返回了一個正確的值。 我們錯過了在我們的網絡流量中看到兩個呼叫在第三個成功之前失敗並返回正確的值(參見下面的屏幕截圖)。 奇怪的是,當我們調試這行代碼時,踩過代碼行導致插件注冊工具崩潰,而網絡流量顯示我們返回了正確的值。 如果我們在這行代碼之后設置一個斷點,那么插件注冊工具不會崩潰,我們的響應中有一個正確的值。 當我們回到庫中的調試而不是直接在插件中調試時,這種行為會發生變化。 在庫中,即使網絡流量仍然顯示成功響應,無論我們在何處設置斷點,插入此行時插件注冊工具始終會崩潰。

網絡流量


更新2

看來我的庫成功地對Web API進行了多次不同的調用,所以我認為問題更多的是插件注冊工具不能處理Web API調用而不是實際工作的調用。

網絡流量

我相信問題在於插件注冊工具分析插件執行。 我的后續問題就在這里

這篇博客指出,我們可以通過使用帶有DefaultCredentials的WebClient使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 
}

確保將UseDefaultCredentials指定為true,以便在插件運行的用戶的上下文中進行web api調用。

由於Sandbox + Adal庫+ AAD令牌組合,我們可能會更多地使用在線插件,因為我們嘗試使用非交互式插件代碼,而不像其他界面我們可以通過提示來挑戰用戶。

此外,Web api對於跨平台,外部CRM上下文集成更有用。 在平台執行中,您可以使用Org服務來實現更多功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM