c# - 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 天。请帮助我..高级谢谢。
解决方案
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);
推荐阅读
- python - 全局布尔值的代码检查返回一个未命名的变量错误
- angular - 服务器端渲染角度中的 Http 标头值
- hyperledger-fabric - 如何将数组元素的丰富查询用于嵌套结构 Hyperledger Fabric?
- r - 具有多个输入数据帧和列名作为更新数据帧的函数参数的 R 函数
- spring-boot - 带有 Hibernate 环境的 Spring Boot:审计表中的所有字段
- vue.js - VIcon 导致开玩笑测试失败 (Vue2/Vuetify3)
- adsense - Adsense 毁了移动端的 Pagespeed 分数,移动端 50,桌面端 98
- css - CSS 背景图像在移动设备上失真
- scala - 为什么在 akka-stream 的单元测试期间会出现此超时?
- javascript - 如何根据数组的先前值设置数组中的值