为何HttpClient.CancelPendingRequests无法在WebApp中取消待处理请求?
ASP.NET Core Web应用中HTTP请求取消功能失效问题
我在ASP.NET Core Web应用中尝试实现服务器端HTTP请求取消功能,基于WeatherForecast示例搭建了演示项目。客户端通过HttpClient发起请求,服务端注入CancellationToken并注册取消逻辑,循环生成数据并延迟执行。调用CancelPendingRequests尝试取消请求时,服务端的CancellationToken无法检测到取消信号;但相同的取消代码在Blazor和.NET桌面客户端中能正常中断服务端处理。
客户端代码
public async Task<IActionResult> OnGet() { string uri = "http://localhost:5031/weatherforecast"; _requestTask = _httpClient.GetFromJsonAsync<IEnumerable<WeatherForecast>>(uri); IEnumerable<WeatherForecast>? forecasts = await _requestTask; _requestTask = null; ViewData["WeatherForecastData"] = forecasts; return Page(); }
服务端代码
[HttpGet] public async Task<IEnumerable<WeatherForecast>> Get(CancellationToken cancellationToken) { bool cancel = false; cancellationToken.Register(() => { cancel = true; }); int count = 5; List<WeatherForecast> ret = new List<WeatherForecast>(); for (int i = 1; i <= count; i++) { Debug.WriteLine($"Iter #{i}"); if (cancel) // (cancellationToken.IsCancellationRequested) { Debug.WriteLine("Cancelled"); throw new Exception($"Canceled after {i} forecast items"); } await Task.Delay(1000); WeatherForecast wf = new WeatherForecast() { Date = DateTime.Now.AddDays(i), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }; ret.Add(wf); } return ret; }
客户端取消代码
public void OnPostCancel () { //cts.Cancel(); _httpClient.CancelPendingRequests(); ViewData["WeatherForecastData"] = new List<WeatherForecast>(); }
内容的提问来源于stack exchange,提问作者Greg Arzoomanian
相关产品推荐
相关产品推荐

