在.net5.0中 - 外部API响应时间花费太长的时间 - httpclient

问题描述 投票:0回答:2

我正在尝试使用 .netcore5.0 中的 httpclint 获取外部 API 的响应。

最初我遇到了超时异常。所以我在添加此响应后添加

 client.Timeout = Timeout.InfiniteTimeSpan;
。但需要20多分钟。

但是我的浏览器可以在几毫秒内获得 API 结果。

如何在短时间内得到API的响应。有什么办法可以减少响应时间吗?

启动.cs

 services.AddHttpClient<IHolidayService, HolidayService>("PublicHolidaysApi", c => c.BaseAddress = new Uri("https://api.xmltime.com"));

服务.cs

public class HolidayService : IHolidayService
    {
        private readonly IHttpClientFactory _clientFactory;

        private readonly HttpClient _client;
        public HolidayService(HttpClient client)
        {
            _client = client;
            client.Timeout = Timeout.InfiniteTimeSpan;
        }
        public  HolidayService(IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
            _client = clientFactory.CreateClient("PublicHolidaysApi");
        }

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

            using (var cts = new CancellationTokenSource(Timeout.InfiniteTimeSpan))
            {
                var response =  await _client.GetAsync(url, cts.Token).ConfigureAwait(false);


                if (response.IsSuccessStatusCode)
                {
                    using var responseStream = await response.Content.ReadAsStreamAsync();
                    result = await JsonSerializer.DeserializeAsync<List<Holiday>>(responseStream);

                }
                else
                {
                    throw new HttpRequestException(response.ReasonPhrase);
                }
            }
  return result;
        }
    }
}

型号

 public class Holiday
        {
            [JsonPropertyName("urlid")]
            public string UrliId { get; set; }

            [JsonPropertyName("url")]
            public string Url { get; set; }

            [JsonPropertyName("country")]
            public Country Country { get; set; }

            [JsonPropertyName("name")]
            public Name Name { get; set; }


            [JsonPropertyName("oneliner")]
            public OneLiner OneLiner { get; set; }

            [JsonPropertyName("date")]
            public Date Date { get; set; }


            [JsonPropertyName("types")]
            public List<string> Types { get; set; }

            [JsonPropertyName("uid")]
            public string UId { get; set; }

        }


        public class Country
        {
            [JsonPropertyName("id")]
            public string Id { get; set; }

            [JsonPropertyName("name")]
            public string Name { get; set; }

        }

        public class Name
        {
            [JsonPropertyName("lang")]
            public string Lang { get; set; }

            [JsonPropertyName("text")]
            public string Text { get; set; }
        }
        public class OneLiner
        {
            [JsonPropertyName("lang")]

            public string Lang { get; set; }

            [JsonPropertyName("text")]
            public string Text { get; set; }

        }
        public class Date
        {
            [JsonPropertyName("iso")]
            public string iso { get; set; }

            [JsonPropertyName("datetime")]
            public DateTime? Datetime { get; set; }

        }
}

c# asp.net-core dotnet-httpclient .net-5 timeoutexception
2个回答
0
投票

这种情况有很多种可能性,我只能给你一个解决问题的方法。

首先我们要定位速度慢的原因。是服务器还是客户端?

我们可以使用

Fiddler
等抓包工具,然后观察对应的网络请求。

如果客户端已发送但服务器未响应,您应该考虑 api 限制... 如果没有,则请求根本没有发送,可能你应该检查 HttpClient 的连接池,或者 dotnet 的

WorkThreadPool


0
投票

你的问题有一些问题。

  1. 它无法编译。
  2. 不完整。
  3. 它有敏感数据。

但我可以立即从 API 获取数据。只需打开此链接https://dotnetfiddle.net/ryjakT并运行该程序。
我改变了一些事情

  1. 返回类型,应该是List
  2. var 结果 = new Holiday(); var 结果 = new List();
  3. 我正在使用 Newtonsoft.Json 进行反序列化。
  4. 您尝试反序列化为不正确的模型,它应该是 Root。
© www.soinside.com 2019 - 2024. All rights reserved.