HttpRequest wird beim Abbruch des Browsers in ASP.NET Core MVC nicht abgebroch

Ich habe den folgenden MVC-Controller geschrieben, um die Abbruchfunktion zu testen:

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

Say, ich möchte die Anfrage stornieren, daher der Wert 'wah 'wird in der obigen Controller-Aktion protokolliert. Dies ist serverseitig möglich, wenn der Server das IHttpRequestLifetimeFeature implementiert. Glücklicherweise tut es Turmfalke und dies kann auf folgende Weise erreicht werden:

var feature = (IHttpRequestLifetimeFeature) HttpContext.Features[typeof(IHttpRequestLifetimeFeature)];
feature.Abort();

Das Problem ist jedoch, dass ich die Anfrage auf der Client-Seite abbrechen möchte. Zum Beispiel im Browser. In Vorgängerversionen von ASP.NET MVC / WebApi wird das Abbruchtoken automatisch abgebrochen, wenn der Browser eine Anforderung abbricht. Beispiel: Aktualisieren Sie die Seite einige Male in Chrome. Auf der Registerkarte "Netzwerk" der Chrome-Entwicklungstools können Sie jetzt sehen, dass die vorherige (noch nicht abgeschlossene) Anforderung abgebrochen wurde.

Das Problem ist: In ASP.NET Core, das auf Kestrel ausgeführt wird, wird nur der folgende Eintrag im Protokoll angezeigt:

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Fehler -4081 ECANCELED-Vorgang abgebrochen

So kommt die Abbruchanforderung vom Browser an und wird vom Kestrel-Webserver verarbeitet. Dies hat jedoch keine Auswirkungen auf die RequestAborted-Eigenschaft von HttpContext im Controller, da der Wert 'falsc 'wird weiterhin von der Methode protokolliert.

Frage Gibt es eine Möglichkeit, die Methode meines Controllers abzubrechen / abzubrechen, sodass die Eigenschaft HttpContext.RequestAborted als abgebrochen markiert wird?

Vielleicht kann ich dafür sorgen, dass ein Abonnement für den Kestrel-Trigger "Vorgang abgebrochen" erstellt wird und die IHttpRequestLifetimeFeature.Abort () -Methode aufgerufen wird?

Aktualisieren Ich habe einige weitere Tests durchgeführt und es scheint, dass die HttpRequest IS tatsächlich abgebrochen, aber es scheint eine gewisse Verzögerung zu geben, bevor die Stornierung tatsächlich stattfindet. Die Verzögerung ist nicht zeitabhängig und scheint direkt aus libuv (der Bibliothek, auf der der Kestrel-Webserver aufbaut) zu stammen. Ich habe mehr Infos auf @ geposthttps: //github.com/aspnet/KestrelHttpServer/issues/110

Weitere Updates: Issue wurde in ein anderes verschoben, da das vorherige mehrere Probleme enthielt.https: //github.com/aspnet/KestrelHttpServer/issues/113

Antworten auf die Frage(2)

Ihre Antwort auf die Frage