我正在尝试从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平台的某些功能,如本地化。