相关疑难解决方法(0)

HttpRequest在ASP.NET Core MVC中没有中止(取消)浏览器中止

我编写了以下MVC控制器来测试取消功能:

class MyController : Controller
{
    [HttpGet("api/CancelTest")]
    async Task<IActionResult> Get()
    {
        await Task.Delay(1000);
        CancellationToken token = HttpContext.RequestAborted;
        bool cancelled = token.IsCancellationRequested;
        logger.LogDebug(cancelled.ToString());
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

说,我想取消请求,因此在上面的控制器操作中记录值' true '.如果服务器实现IHttpRequestLifetimeFeature,这可能是服务器端.幸运的是,Kestrel确实如此,这可以通过以下方式实现:

var feature = (IHttpRequestLifetimeFeature) HttpContext.Features[typeof(IHttpRequestLifetimeFeature)];
feature.Abort();
Run Code Online (Sandbox Code Playgroud)

但问题是我想在客户端取消请求.例如,在浏览器中.在ASP.NET MVC/WebApi的预核版本中,如果浏览器中止请求,则取消令牌将自动取消.示例:在Chrome中多次刷新页面.在chrome dev工具的"网络"选项卡中,您现在可以看到取消上一个(未完成的)请求.

问题是:在Kestrel上运行的ASP.NET Core中,我只能在日志中看到以下条目:

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException:错误-4081 ECANCELED操作已取消

因此,来自浏览器的中止请求到达并由Kestrel网络服务器处理.但它不会影响控制器中HttpContext的RequestAborted属性,因为该方法仍会记录值' false '.

问题: 有没有办法中止/取消我的控制器方法,以便将HttpContext.RequestAborted属性标记为已取消?

也许我可以做一些订阅Kestrel的操作取消触发器并调用IHttpRequestLifetimeFeature.Abort()方法的东西?

更新: 我做了一些进一步的测试,看起来HttpRequest IS实际上已经中止,但在实际取消之前似乎有某种延迟.延迟不是时间因素,似乎直接来自libuv(Kestrel网络服务器构建在其上的库).我在https://github.com/aspnet/KestrelHttpServer/issues/1103上发布了更多信息

更多更新: 问题已移至另一个,因为前一个包含多个问题.https://github.com/aspnet/KestrelHttpServer/issues/1139

cancellation asp.net-core-mvc kestrel-http-server asp.net-core

14
推荐指数
1
解决办法
2594
查看次数

Kestrel + IIS 反向代理请求中止未触发

我们有一个 ASP.NET Core 2.x 应用程序,它实现了自定义中间件,充当另一个(基于 Java 的)服务器/应用程序前面的代理。在服务器请求完成之前,此应用程序/中间件的客户端经常中止/取消他们的请求是很常见的。

我们已将此应用程序部署到 IIS(作为反向代理)并在 Kestrel 上运行。在 Core 2.x 之前,Kestrel 有一个错误,它HttpContext.RequestAborted总是导致false这里其他相关问题)......这显然在 2.x 中得到了修复(我已经能够确认)。

但是,似乎在 Kestrel 前面运行 IIS 时,它不会将请求中止转发到 Kestrel,RequestAborted并且仍然总是false

有什么方法可以RequestAborted在此配置中工作(或者如果没有,则可以通过任何其他方式检测它)?

简单复制仓库:https : //github.com/mikeomeara1/RequestAbortRepro

更新

此评论似乎表明了一个已知问题,但在多大程度上尚不清楚

这个问题似乎也是相关的,但对我来说,它的直接关系并不完全明显(至少它没有用这样的术语来说明)。

@spender - 如果我理解正确,标题比较在这里。如果没有,请告诉我,你想看什么我都给你。

茶叶似乎表明了一个已知问题。所以,问题是;有没有办法解决这个问题?我们刚刚经历了(一个非常痛苦的)1.1 到 2.x 的升级,希望这个问题能得到解决,让我们的服务器再运行一个月/季度/年让我们非常担心这一点。我们正在开发的系统在数量上大大增加。

因此,欢迎任何变通方法、黑客或疯狂的想法。

c# iis kestrel-http-server asp.net-core

5
推荐指数
1
解决办法
859
查看次数

iis 中的取消令牌未触发

我有一个带有 .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();
    }
Run Code Online (Sandbox Code Playgroud)

.net iis-express cancellation-token .net-core asp.net-core

2
推荐指数
1
解决办法
1284
查看次数