DNN 8.0 (DotNetNuke) С контроллером asyn c поведение ожидания не соответствует ожидаемому - PullRequest
0 голосов
/ 08 июля 2020

Я экспериментирую с асинхронным вызовом Azure Rest Api из модуля DNN (это для клиента, который использует платформу DNN и более старую версию, а именно 8.0). Мне нужен этот вызов для получения данных перед возвратом представления.

Я сделал контроллер asyn c, чтобы он "ожидал" получения данных из azure rest api.

Поведение неожиданное. Код останавливается в этой точке останова (как в окне браузера с пустым представлением появляется всплывающее окно, но код после этой точки не выполняется), и представление остается пустым и никогда не продолжается до кода, заполняющего модель представления для страницы:

var result = await httpClient.GetStringAsync(url);

Иногда результат (пользователь db) возвращается должным образом из db, но представление все еще пустое, даже если другие точки останова после ожидания были достигнуты в контроллере ... Представление кажется возвращенным до вызова ожидания завершено? Окно просмотра получает фокус до завершения ожидания, но представляет собой пустую страницу.

Любые предложения о том, что происходит, пожалуйста?

В классе контроллера DNN:

public async Task<ActionResult> Index() : DnnController
{
   ViewModel pageVM = new ViewModel();

   AuthenticationApi authService = new AuthenticationApi();
   var outcome = await authService.GetDbUser();  // AWAIT
   
   // populate the pageVM
   .................
   
   return View(pageVM);
   
}

В папке Services в классе AuthenticationApi:

public class AuthenticationApi
{
        public async Task<DbUser> GetDbUser()
        {
            string url = "https://mywebservicename.azurewebsites.net/api/applicants/46";

            var httpClient = new HttpClient();

            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            try
            {
                var result = await httpClient.GetStringAsync(url);

                return JsonConvert.DeserializeObject<DbUser>(result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

                return null;
            }

        }
}

1 Ответ

1 голос
/ 09 июля 2020

Основной конвейер ответа в платформе DNN основан на веб-формах и в настоящее время (даже с версией 9.6.2) не поддерживает использование async / await в основном конвейере.

Есть планы развития это будет поддерживаться в версии 10.x, однако необходимы дополнительные изменения, чтобы гарантировать, что языковые функции не нарушены.

Некоторым пользователям удалось добавить этот

aspnet:UseTaskFriendlySynchronizationContext

параметр приложения со значением true, однако, известно, что это нарушает некоторые функции платформы DNN, такие как локализация.

...