You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:16:17