10

私がキャンセル機能をテストするには、次のMVCコントローラを書いた:はHttpRequestのブラウザ上で(キャンセル)中止されていないASP.NETコア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(); 
    } 
} 

言ってやるが、私は要求をキャンセルしたい場合は、「値のでtrue 'が上記のコントローラーアクションに記録されます。サーバーがIHttpRequestLifetimeFeatureを実装している場合、これはサーバー側で可能です。幸いにもケストレルはありませんが、これは、以下の方法で行うことができます。

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

問題は、しかし、私は、クライアント側の要求をキャンセルしたいということです。たとえば、ブラウザーで。 ASP.NET MVC/WebApiのプレコアバージョンでは、ブラウザがリクエストを打ち切った場合、取り消しトークンは自動的にキャンセルされます。例:Chromeでページを数回リフレッシュするchrome開発ツールの[ネットワーク]タブで、以前の(未完了の)リクエストをキャンセルすることができます。

事がある:

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: エラーASP.NETコアはケストレル上で実行されている中で、私は唯一のログに次のエントリを見ることができます-4081 ECANCELED操作がキャンセルされました

ブラウザからの打ち切り要求が到着し、Kestrel Webサーバーによって処理されます。ただし、 'false'の値は、このメソッドによってまだ記録されているため、コントローラのHttpContextのRequestAbortedプロパティには影響しません。

質問:キャンセルとしてHttpContext.RequestAbortedプロパティがマークされるように は/中止私のコントローラのメソッドをキャンセルする方法は、ありますか?

おそらく、私はKestrelの操作がキャンセルされたトリガーを購読し、IHttpRequestLifetimeFeature.Abort()メソッドを呼び出すことができますか?

更新: 私はさらにいくつかのテストを行なったし、HttpRequestのが実際に中止さですが、キャンセルが実際に行われる前に、遅延のいくつかの種類があるように思われるようです。遅れは時間に因数分解されず、libuv(Kestrelウェブサーバが上に構築されているライブラリ)からまっすぐに来ているようです。 前のものは、複数の問題が含まれているため問題は、別のものに移動されました:私はhttps://github.com/aspnet/KestrelHttpServer/issues/1103

ほかのアップデートの詳細情報を掲載しました。 https://github.com/aspnet/KestrelHttpServer/issues/1139

+0

問題は現在修正されているようですので、この質問をトピックとして閉じるよう投票しています。 – Set

+0

@Set:それは問題ありません。実際に2.0で修正する必要があります。私は自分自身で質問を終わらせることができないのですか? –

+1

あなたが他のユーザーにとって役に立たないと思う場合は、質問を削除することができます。また、独自の回答を投稿して(後で受け入れることもできます)、Kestrel Server実装のバグであったと言えます。 – Set

答えて

1

単にHttpContext.RequestAbortedを使用するのは正しい方法ですが、Kestrelのバグ(FIN/RSTパッケージの処理順序)によって、ブラウザのアボートでリクエストが中断されないことがわかりました。

最終的にバグはKestrel 2.0で修正されるはずです。

詳細は私の質問の更新を参照してください。

関連する問題