DNN 8.0 (DotNetNuke) 使用异步控制器时,等待行为不符合预期

DNN 8.0 (DotNetNuke) With async controller, await behavior is not as expected

我正在尝试从 DNN 模块异步调用 Azure Rest Api(这是针对使用 DNN 平台及其旧版本(即 8.0)的客户端)。在返回视图之前,我需要此调用来检索数据。

我将控制器设为异步,以便“等待”从 azure rest 获取数据 api。

该行为是意外的。代码在此断点处停止(如在浏览器 window 中弹出空白视图但此点之后的代码不会执行)并且视图为空白并且永远不会继续代码填充页面的视图模型:

var result = await httpClient.GetStringAsync(url);

有时结果(数据库用户)从数据库中正确返回,但视图仍然是空白,即使等待之后的其他断点已在控制器中命中...视图似乎在等待之前返回调用完成?视图 window 在等待完成之前获得焦点,但作为空白页。

请问有什么建议吗?

在 DNN 控制器中 class:

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);
   
}

在服务文件夹中,在身份验证Api class:

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;
            }

        }
}

DNN 平台中的主要响应管道是基于网络表单的,目前(即使是版本 9.6.2)不支持在主要管道中使用 async/await。

有在版本 10.x 中支持此功能的路线图计划,但是,需要进行其他更改以确保语言功能不被破坏。

一些用户通过添加这个已经成功了

aspnet:UseTaskFriendlySynchronizationContext

值为 true 的应用程序设置,但已知会破坏 DNN 平台的某些功能,例如本地化。