代码之家  ›  专栏  ›  技术社区  ›  Armin Torkashvand

IIS中的取消令牌未触发

  •  1
  • Armin Torkashvand  · 技术社区  · 6 年前

    我有一个带有.NET核心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();
        }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Tseng    6 年前

    现在,当将ASP.NET核心托管到2.1英寸(或更具体的延迟)IIS中时,这是不可能的,取消或连接丢失不会传递给ASP.NET核心应用程序。

    现在,它只在通过kestrel或http.sys(以前称为weblistener)直接托管/公开时工作。

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

    查看 ASP.NET Core 2.2-preview3 Announcement blog .

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

    但是,请注意,虽然进程内添加了改进的性能和更少的开销,但这也意味着如果我记得正确的话,每个应用程序池只能有一个应用程序作为进程内托管。

    推荐文章