iis 中的取消标记未触发

Cancellation token in iis not triggering

我有一个带有 .net core 2.1 的 API 并在操作中使用取消令牌。当我 运行 使用 iis 的项目并在浏览器中发出一个简单的请求时,在我取消它之后,它没有按预期工作并且 运行 所有带有取消令牌的方法都传递给了它们。 但是当我 运行 使用 kestrel 服务器的项目时,取消请求会导致服务器按预期工作。这是为什么?

    [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();
    }

目前,在 IIS 中托管 ASP.NET 核心高达 2.1(或更具体的背后)时,这是不可能的,取消或连接丢失不会传递给 ASP.NET 核心应用。

目前仅当 hosting/exposing 直接通过 Kestrel 或 HTTP.SYS(以前称为 Weblistener)时才有效。

使用 ASP.NET Core 2.2(来自预览版 3 及更高版本),AspNetCoreModule 已更新以支持此功能。但是,它仅限于 IIS 进程内托管,并且当 IIS 仅充当反向代理时将不起作用。

参见ASP.NET Core 2.2-preview3 Announcement blog

We added support for the ability to detect client disconnects when you’re using the new IIS in-process hosting model. The HttpContext.RequestAborted cancellation token now gets tripped when your client disconnnects.

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