Call Dynamics Web API в плагине C#

У меня есть поток бизнес-процессов в Microsoft Dynamics для управления созданием нового клиента. Когда процесс заканчивается, я присоединяю рабочий процесс, который запускает действие, которое вызывает плагин для некоторой пользовательской обработки. Я следую этой статье, чтобы настроить этот процесс.

В моем плагине у меня есть вызов к 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 call фактически возвращал правильное значение. В нашем сетевом трафике мы пропустили, что два вызова не были выполнены до того, как третий завершился успешно и вернул правильное значение (см. Скриншот ниже). Странно то, что когда мы отлаживаем эту строку кода, переступая через строку кода, происходит сбой инструмента регистрации плагинов, когда сетевой трафик показывает, что мы вернули правильные значения. Если мы установим точку останова после этой строки кода, то инструмент регистрации плагинов не будет аварийно завершен, и в нашем ответе будет правильное значение. Это поведение меняется, когда мы вернулись к отладке в библиотеке, а не непосредственно в плагине. В библиотеке инструмент регистрации плагинов всегда падает при попадании на эту строку независимо от того, где мы установили наши точки останова, даже если сетевой трафик все еще показывает успешный ответ.

Сетевой трафик


Обновление 2

Может показаться, что моя библиотека успешно выполняет несколько различных вызовов Web API, поэтому я думаю, что проблема заключается в том, что инструмент регистрации плагинов не может обрабатывать вызов Web API больше, чем вызов, который фактически не работает.

Сетевой трафик

2 ответа

Решение

Я считаю, что проблема была в средстве регистрации плагинов, профилирующем выполнение плагинов. Мой следующий вопрос здесь.

В этом блоге говорится, что мы можем заставить Web Api работать в локальном плагине CRM (не-IFD), используя WebClient с DefaultCredentials.

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, чтобы сделать вызов веб-API в контексте пользователя, который запускается плагином.

Мы можем больше бороться с онлайн-плагинами из-за комбинации Sandbox + Adal library + AAD tokens, поскольку мы пытаемся создать неинтерактивный код плагина в отличие от другого интерфейса, где мы можем вызвать пользователя по запросу.

Более того, Web API более полезен для кроссплатформенной интеграции вне контекста CRM. Внутри платформы вы можете использовать сервис Org для достижения большего.

Другие вопросы по тегам