首页 > 解决方案 > HttpClient 响应消息“操作已取消。”。postman 中的 json 结果是 [ ]? 如何从 API 获取所有数据

问题描述

我正在使用https://www.timeanddate.com/这个 API 来获取假期详情。

当我调试 HttpClient 响应消息是“操作已取消”。 '($exception).CancellationToken.WaitHandle' 引发了“System.ObjectDisposedException”类型的异常

POSTMAN 中的响应是[] (响应类型:200k)。

控制器

 public async Task<IActionResult> Get(string country, int year)
        {
            List<Holidays> holidays = new List<Holidays>();
            holidays = await _holidayService.GetHolidays(country, year);

            return Ok(holidays);
        }

服务

   public HolidayService(HttpClient client)
        {
            _client = client;
            _client.Timeout = TimeSpan.FromMinutes(3);
        }

        public async Task<List<Holidays>> GetHolidays(string country, int year)
        {
            string url = string.Format($"/holidays?accesskey=ACCESSKEY&secretkey=SECRET&version=3&country=ro&year=2021&lang=en");
            var result = new List<Holidays>();

            try
            {
                using var response = await _client.GetAsync(url);
            }
            // Filter by InnerException.
            catch (TaskCanceledException ex) when (ex.InnerException is TimeoutException)
            {
                // Handle timeout.
                Console.WriteLine("Timed out: " + ex.Message);
            }
            catch (TaskCanceledException ex)
            {
                // Handle cancellation.
                Console.WriteLine("Canceled: " + ex.Message);
            }

            return result;


        }

启动

  HttpClientsConfig.InjectServices(services, Configuration);
            services.AddHttpClient<IHolidayService, HolidayService>(c =>
            {
                c.BaseAddress = new System.Uri(Configuration.GetValue<string>("Holiday:Url"));
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });

AppSetting.development.json

"Holiday": {
  "AccessKey": "MY_ACCESS_KEY",
  "SecretKey": "MY_SECRET_KEY",
  "Url": "https://api.xmltime.com"
}

我如何获得所有类似这样的回复https://api.xmltime.com/holidays?accesskey={MY_ACCESS_KEY}&secretkey={MY_SECRET_KEY}&version=3&country=ro&year=2021&lang=en

我试图获得 API 响应超过 4 天。请帮助我..高级谢谢。

标签: c#asp.net-corepostmanhttpresponsedotnet-httpclient

解决方案


You could try to deserialize the response like below

  public async Task<List<Holidays>> GetHolidays(string country, int year)
    {
        string url = string.Format($"/holidays?accesskey=ACCESSKEY&secretkey=ACCESSKEY&version=3&country=ro&year=2021&lang=en");
        var result = new List<Holidays>();

        try
        {
           _client.Timeout= Timespan. FromMinutes(30);
            using var response = await _client.GetAsync(url);
            string jsonString= await response.Content.ReadAsStringAsync();
            var root=JsonConvert.DeserializeObject<Root>(jsonString);
            return root.holidays;
        }
        // Filter by InnerException.
        catch (TaskCanceledException ex) when (ex.InnerException is TimeoutException)
        {
            // Handle timeout.
            Console.WriteLine("Timed out: " + ex.Message);
        }
        catch (TaskCanceledException ex)
        {
            // Handle cancellation.
            Console.WriteLine("Canceled: " + ex.Message);
        }
        return result;
    }

Alternatively you can use the nuget package

dotnet add package TimeAndDate.Services

var country = "no";
var service = new HolidaysService('accessKey', 'secretKey');
var result = service.GetHolidaysForCountry(country, 2020);

推荐阅读