我有以下控制器:

public class PingController : ApiController
{
    [Route("api/ping")]
    [HttpGet]
    public IHttpActionResult Ping()
    {
        var log = HostLogger.Get(typeof(PingController));
        log.Info("Ping called.");
        return Ok("Ping succeeded @ " + DateTime.UtcNow);
    }

    [Route("api/long-ping")]
    [HttpGet]
    public async Task<IHttpActionResult> LongPing(CancellationToken cancelToken)
    {
        await Task.Delay(30 * 1000);
        return Ok("Ping succeeded @ " + DateTime.UtcNow);
    }
}


如果我执行LongPing,然后在不同的浏览器选项卡中执行Ping,则Ping将在LongPing之前执行并返回-这正是我所要的。问题是当我执行两个LongPing调用时,第二个需要大约60秒钟才能完成(而不是30秒)。 Chrome浏览器报告第二个呼叫的延迟为58s(60s减去我启动第二个请求所花费的时间)。在我看来,如果我能够正常运行,两个LongPing调用都应该在30秒左右执行。

我还应该提到,我是在OWIN托管环境而不是IIS中托管它。但是我认为这没有什么不同,但是也许有人会证明我错了。

如何使LongPing真正表现得像异步请求?

最佳答案

您的会话状态很可能导致您的问题。对此行为有一个冗长的解释,但简短的版本是,特定的用户会话一次只能执行一个请求,因为会话状态会锁定以确保状态一致。如果您想加快速度,请禁用Cookie来测试会话状态假设(这样,每个请求将获得1个会话状态),或者在应用程序中禁用会话状态。否则,您的代码是异步的。

关于c# - 如何使 Controller Action 真正异步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21784866/

10-13 08:24