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

.NET Core 3.1调用timeanddate API触发TaskCanceledException如何解决

异常产生原因

  • 超时设置过短:你注入的HttpClient实例_client超时设置为TimeSpan.FromMilliseconds(30),仅30毫秒。境外API的网络往返耗时通常远高于这个值,请求还没收到响应就触发超时取消,抛出TaskCanceledException。
  • 请求头缺失:timeanddate的API对请求合法性校验更严格,Postman请求会默认携带User-Agent等标准头,而.NET默认的HttpClient如果未显式配置,可能缺失必要请求头被服务端主动断开连接,触发请求取消。
  • 混用HttpClient实例:你的代码中同时定义了静态Http实例、注入的_client实例、IHttpClientFactory三类HTTP调用入口,不同实例的配置不统一,静态Http未显式设置超时,也没有配置默认请求头,也会导致请求异常。
  • 反序列化结构不匹配:timeanddate的holidays接口返回的根节点是包含元数据+holidays数组的对象,并非直接返回Holiday数组,你直接反序列化为List<Holiday>会触发序列化异常,也可能间接导致请求流程异常中断。

解决方法

  1. 修正超时配置:将超时时间调整为合理值,比如TimeSpan.FromSeconds(10),给境外API留足响应时间。
  2. 统一HttpClient使用逻辑:推荐用IHttpClientFactory管理实例,配置全局默认请求头,示例配置:
// Program.cs/Startup.cs中注册服务
services.AddHttpClient<IHolidayService, HolidayService>(client =>
{
    client.BaseAddress = new Uri("https://api.xmltime.com");
    client.Timeout = TimeSpan.FromSeconds(10);
    // 增加必要请求头
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
    client.DefaultRequestHeaders.Add("Accept", "application/json");
});
  1. 修正服务内部逻辑,删除冗余的静态Http实例和多余的CancellationTokenSource代码,统一用注入的HttpClient调用,同时调整反序列化结构:
    首先定义根响应类:
public class HolidayRootResponse
{
    [JsonPropertyName("holidays")]
    public List<Holiday> Holidays { get; set; }
    // 其他返回字段按需添加
}

然后修改GetHolidays方法:

public async Task<List<Holiday>> GetHolidays(string country, int year)
{
    var result = new List<Holiday>();
    try
    {
        var url = $"/holidays?accesskey=dYjG8ztthf&secretkey=veUV06dNmrnp7bbaYq0u&version=3&country={country}&year={year}&lang=en";
        var response = await _client.GetAsync(url);
        response.EnsureSuccessStatusCode();
        using var responseStream = await response.Content.ReadAsStreamAsync();
        var root = await JsonSerializer.DeserializeAsync<HolidayRootResponse>(responseStream);
        result = root?.Holidays ?? new List<Holiday>();
    }
    catch (TaskCanceledException ex) when (ex.InnerException is TimeoutException)
    {
        Console.WriteLine("请求超时: " + ex.Message);
    }
    catch (TaskCanceledException ex)
    {
        Console.WriteLine("请求被取消: " + ex.Message);
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine("请求异常: " + ex.Message);
    }
    catch (JsonException ex)
    {
        Console.WriteLine("返回结果解析异常: " + ex.Message);
    }
    return result;
}
  1. 如果网络环境访问境外API延迟过高,可以配置代理或者升级网络链路,避免网络层面的超时。

内容的提问来源于stack exchange,提问作者hanu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:39:00