.NET?Core使用?CancellationToken?取消API請求的操作方法
您是否曾經(jīng)訪問過一個網(wǎng)站,它需要很長時間加載,最終你敲擊 F5 重新加載頁面。
即使用戶刷新了瀏覽器取消了原始請求,而對于服務器來說,API也不會知道它正在計算的值將在結(jié)束時被丟棄,刷新五次,服務器將觸發(fā) 5 個請求。
為了解決這個問題,ASP.NET Core 為 Web 服務器提供了一種機制,就是CancellationToken.
用戶取消請求時,你可以使用HttpContext.RequestAborted訪問,您也可以使用依賴注入將其自動注入到您的操作中。
長時間運行的任務請求
現(xiàn)在我們假設您有一個 API 操作,在向用戶發(fā)送響應之前可能需要一些時間才能完成。
在處理該操作時,用戶可以直接取消請求,或刷新頁面(這會有效地取消原始請求,并啟動新請求)。
[HttpGet(Name = "get")] public async Task<string> GetAsync() { try { _logger.LogInformation("request in"); await Task.Delay(5 * 1000); _logger.LogInformation("request end"); } catch (Exception ex) { _logger.LogInformation("request ex"); } return "ok"; }
如果用戶在請求中途刷新瀏覽器,那么瀏覽器永遠不會收到第一個請求的響應,但在server端可以看到,操作方法執(zhí)行完成兩次。
這是否是正確將取決于您的應用程序。
如果請求修改某些業(yè)務的狀態(tài),那么您可能不希望在方法中途停止執(zhí)行。如果請求沒有副作用,那么您可能希望盡快停止(可能很昂貴)操作。
用戶取消請求時,你可以使用HttpContext.RequestAborted訪問,您也可以使用依賴注入將其自動注入到您的操作中。
CancellationTokens取消不必要的請求
以下代碼顯示了如何通過將CancellationTokenSource 注入到操作方法中,并通過其取消不必要的操作。
[HttpGet(Name = "get")] public async Task<string> GetAsync(CancellationToken cancellationToken) { try { _logger.LogInformation("request in"); await Task.Delay(5 * 1000,cancellationToken); _logger.LogInformation("request end"); } catch (Exception ex) { _logger.LogInformation("request ex"); } return "ok"; }
通過這個改變,我們可以再次測試我們的場景。
我們發(fā)出一個初始請求,然后我們重新加載頁面。正如您從下面的日志中看到的,第一個請求不會繼續(xù)執(zhí)行。
用戶刷新瀏覽器取消請求后不久,原始請求就會中止,并TaskCancelledException通過 API 過濾器管道傳播回來,并備份中間件管道。
根據(jù)您的場景,您可能能夠依靠此類框架方法來檢查 的狀態(tài)CancellationToken,或者您可能需要自己監(jiān)視取消請求。
過濾器捕獲異常
您可以通過以上try catch 捕獲,或者通過一個過濾器統(tǒng)一監(jiān)視此異常。
public class OperationCancelledExceptionFilter : ExceptionFilterAttribute { private readonly ILogger _logger; public OperationCancelledExceptionFilter(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<OperationCancelledExceptionFilter>(); } public override void OnException(ExceptionContext context) { if (context.Exception is OperationCanceledException) { _logger.LogInformation("Request was cancelled"); context.ExceptionHandled = true; context.Result = new StatusCodeResult(400); } } } builder.Services.AddControllers(options => { options.Filters.Add<OperationCancelledExceptionFilter>(); });
到此這篇關于.NET Core使用 CancellationToken 取消API請求的文章就介紹到這了,更多相關.NET Core取消API請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ASP.NET URL偽靜態(tài)重寫實現(xiàn)方法
ASP.NET下為靜態(tài)的實現(xiàn)方法。2009-12-12點擊圖片,AJAX刪除后臺圖片文件的實現(xiàn)代碼(asp.net)
點擊頁面上的圖片,用jQuery的AJAX來刪除后臺真實的文件。2010-11-11詳解ASP.NET MVC 利用Razor引擎生成靜態(tài)頁
本篇文章主要介紹了ASP.NET MVC 利用Razor引擎生成靜態(tài)頁,詳細的介紹了原理和步驟,具有一定的參考價值,有興趣的可以了解一下。2017-03-03ASP.NET對HTML頁面元素進行權(quán)限控制(一)
界面每個元素的權(quán)限也是需要控制的。比如一個查詢用戶的界面里面有查詢用戶按鈕,添加用戶按鈕,刪除用戶按鈕,不同的角色我們得分配不同的權(quán)限2013-12-12