你好,我的控制器上有此代码:
[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`)
})
}
没有基于回调的功能可以进行测试吗?