【发布时间】:2022-01-10 22:08:38
【问题描述】:
我正在为一个学校项目开发一个应用程序,该应用程序使用来自 CoinGecko 的免费公共 API 的数据。我获取数据的方式是使用 HttpWebRequest 类。起初,我能够快速使用 API,没有任何问题,但最近请求在 GetResponse() 函数中卡住了很长时间。即使 ping API 也需要大约 30 秒才能完成。我已经阅读了很多关于这个问题的帖子,但没有一个建议奏效。
try
{
string uri = "https://api.coingecko.com/api/v3/ping";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.Accept =
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng," +
"*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
request.ContentType = "application/json";
request.Headers.Add("accept-encoding", "gzip, deflate, br");
request.Headers.Add("accept-language", "en-US,en;q=0.9");
request.Headers.Add("cache-control", "max-age=0");
request.Headers.Add("if-none-match", "W/\"c1f074e1bdf979ac5dc291f2c0acf9e4\"");
request.Headers.Add("sec-ch-ua", "\" Not A;Brand\"; v = \"99\", \"Chromium\"; v = \"96\", \"Google Chrome\"; v = \"96\"");
request.Headers.Add("sec-ch-ua-mobile", "?0");
request.Headers.Add("sec-ch-ua-platform", "\"Windows\"");
request.Headers.Add("sec-fetch-dest", "document");
request.Headers.Add("sec-fetch-mode", "navigate");
request.Headers.Add("sec-fetch-site", "none");
request.Headers.Add("sec-fetch-user", "?1");
request.Headers.Add("upgrade-insecure-requests", "1");
request.UserAgent =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)" +
" Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55";
request.Proxy = null;
using HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created)
{
throw new ApplicationException("REST client error code: "
+ response.StatusCode.ToString());
}
using Stream stream = response.GetResponseStream();
if (stream == null)
{
throw new ApplicationException("Error: Null response");
}
using StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
catch (Exception ex)
{
return ex.ToString();
}
它适用于浏览器,因此我复制了所有浏览器请求标头并将它们添加到代码中,但它们没有帮助。我也尝试过:增加连接数,使用所有安全协议类型,禁用我的防火墙。会不会是 API 正在检测并减慢我的请求,因为它们不是“人类”?
【问题讨论】:
-
这个 API 确实出现在 enforce rate limiting (50 次调用/分钟),虽然我想你不会经常调用它?我不希望这样的服务在与他们的公共 API 通信时关心你是否是人。 (根据定义,API 通常不被人类直接调用)
-
它确实有这个限制,你是对的,我不经常这么称呼它。即使我这样做了,它应该让我在一天后正常提出请求。
标签: c# .net web httpwebrequest getresponse