异步/等待在ASP.NET核心控制器动作中无法正常工作



你好,我的控制器上有此代码:

[HttpGet]
[Route("/Test")]
public async Task<IActionResult> Test() {
    Console.WriteLine("foo");
    await Task.Delay(2000);
    Console.WriteLine("bar");
    return Ok();
}

尝试通过JavaScript进行测试:

for(let i=0; i<2; i++){
    axios.get('/Test').then(response => {
        console.log(`task ${i} finish`)
    })  
}

我希望服务器上的输出应为:

foo
foo
foo
bar
bar
bar

但是我得到的是:

foo
bar
foo
bar
foo
bar

我感到困惑的是,await Task.Delay(2000)没有将控制流返回流程并能够处理其他请求吗?在我看来,动作方法无法同时处理大量请求。我是否误解了异步/等待的东西?如果要模拟非阻止冗长的Web服务调用,该怎么办?

我读了这篇文章,但仍然无法弄清楚解决方案是什么

最有可能按顺序从同一客户端请求的ASP.NET处理请求。意味着在第一次进行时,它不会开始处理第二请求。对于较旧的ASP.NET MVC在全框架上确实如此,这样就避免了并发访问会话状态。可以通过应用SessionState(SessionStateBehaviour.Disabled)属性来更改此行为。检查此问题ASP.NET MVC和AJAX,并发请求吗?也许类似的东西适用于ASP.NET核心。

我是否误解了异步/等待的一些东西?如果要模拟非阻止冗长的Web服务调用,该怎么办?

请求处理没有阻止。它们只是顺序。如果您尝试从不同的客户端访问相同的操作(浏览器),您会发现他们并行执行。

我以前从未真正与Axios合作,但是从代码的外观看,您的ASP.NET代码不是问题,而是JavaScript。

asp.net处理异步/等待很好,在您的示例中,它做对了。问题在于,看起来您的JavaScript一次执行1个请求,等待结果(需要2秒)然后继续进行for循环。

for(let i=0; i<2; i++){
    // this starts a request to /Test and waits the result
    // since your controller waits 2 seconds before returning OK
    // it looks like its sync
    axios.get('/Test').then(response => {
        console.log(`task ${i} finish`)
    })  
}

没有基于回调的功能可以进行测试吗?

最新更新