私がキャンセル機能をテストするには、次の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
問題は現在修正されているようですので、この質問をトピックとして閉じるよう投票しています。 – Set
@Set:それは問題ありません。実際に2.0で修正する必要があります。私は自分自身で質問を終わらせることができないのですか? –
あなたが他のユーザーにとって役に立たないと思う場合は、質問を削除することができます。また、独自の回答を投稿して(後で受け入れることもできます)、Kestrel Server実装のバグであったと言えます。 – Set