DNN8.0(DotNetNuke)使用异步控制器,等待行为并不像预期的那样



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

我使控制器异步;等待";从azurerest api获取数据。

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

var result = await httpClient.GetStringAsync(url);

有时,结果(数据库用户(会从数据库中正确返回,但即使在等待之后的其他断点在控制器中被命中,视图仍然是空白的。。。视图似乎在等待呼叫完成之前返回?"视图"窗口在等待完成之前获得焦点,但显示为空白页。

有什么建议吗?

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

}

在AuthenticationApi类的Services文件夹中:

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平台内的主响应管道是基于web表单的,目前(即使是9.6.2版本(也不支持在主管道中使用async/await。

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

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

aspnet:UseTaskFriendlySynchronizationContext

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

最新更新