我有一个带有.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();
}
答案 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只能托管一个应用程序。