【问题标题】:What are the reasons an HttpWebRequest might take half a minute to get a response?HttpWebRequest 可能需要半分钟才能得到响应的原因是什么?
【发布时间】: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


【解决方案1】:

通过在命令行中键入以下内容,将 Windows 设置为 IPv4 的优先级:

netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 46 4

Source

【讨论】:

  • 您能否提供一些推理,为什么这可以解决您的问题?
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多