IIS中的取消令牌未触发

时间:2018-10-29 11:44:25

标签: .net asp.net-core .net-core iis-express cancellation-token

我有一个带有.net core 2.1的API,并在操作中使用了取消令牌。当我使用iis运行该项目并在浏览器中提出一个简单的请求时,取消该项目后,它无法按预期方式运行,并运行所有带有取消令牌的方法。 但是,当我使用红est服务器运行项目时,取消请求会使服务器按预期工作。这是为什么?

    [HttpGet("get")]
    public async Task<IActionResult> GetSome(CancellationToken ct)
    {

        _logger.LogInformation("The slow Request Start");
        try
        {
            await Task.Delay(10_000, ct);
            _logger.LogCritical("Successful");
        }
        catch (Exception)
        {
            _logger.LogInformation("Task Cancelled");
        }
        var message = "The request finished";

        _logger.LogInformation(message);

        return NoContent();
    }

1 个答案:

答案 0 :(得分:3)

现在,当在IIS中(或更高级别)承载高达2.1的ASP.NET Core时,这是不可能的,取消或连接丢失将不会传递给ASP.NET Core应用程序。

现在,它仅在直接通过Kestrel或HTTP.SYS(以前称为Weblistener)进行托管/公开时有效。

使用ASP.NET Core 2.2(来自preview3和更高版本),AspNetCoreModule已更新为支持此功能。但是,它仅限于IIS进程内托管,当IIS只是反向代理时将无法使用。

请参见ASP.NET Core 2.2-preview3 Announcement blog

  

我们增加了对当您使用新的IIS进程内托管模型时检测客户端断开连接的功能的支持。现在,当客户断开连接后,HttpContext.RequestAborted取消令牌就会被触发。

但是,请注意,虽然进程内可提高性能并减少开销,但如果我没记错的话,这也意味着每个App Pool只能托管一个应用程序。