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