【问题标题】:How to perform a fast web request in C#如何在 C# 中执行快速 Web 请求
【发布时间】:2014-07-30 04:43:12
【问题描述】:

我有一个基于 HTTP 的 API,我可能需要多次调用它。问题是我无法让请求花费不到 20 秒,尽管通过浏览器发出的相同请求几乎是瞬时的。以下代码说明了到目前为止我是如何实现它的。

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla");
var response = r.GetResponse();

一种解决方案是发出异步请求,但我想知道为什么需要这么长时间以及是否可以避免它。我也尝试过使用 WebClient 类,但我怀疑它在内部使用了 WebRequest。

更新:

在发布模式下运行以下代码大约需要 40 秒(使用秒表测量):

WebRequest g = HttpWebRequest.Create("http://www.google.com");
var response = g.GetResponse();

我在一所大学工作,那里的网络配置可能会影响性能,但直接使用浏览器说明它应该几乎是即时的。

更新 2:

我将代码上传到远程计算机,它运行良好,因此结论一定是 .NET 代码与浏览器相比做了一些额外的事情,或者它在通过大学网络解析地址时遇到问题(代理问题或其他什么?! )。

【问题讨论】:

  • 您如何确定是 Web 请求需要时间?我通常对 HttpWebRequest 类没有任何性能问题。您是否尝试过让应用程序执行多个调用,如果是,是否所有调用都花费了同样多的时间?
  • 所有网址都会出现这种情况,例如 google.com?使用非 SSL 网址怎么样?
  • 是的,Fredrik 的 cmets 和建议都很好。没有任何理由认为 HttpWebRequest 应该在任何方面表现不佳(更不用说 那个 很差) - 毕竟它使用与浏览器相同的协议。
  • 在获取诸如“google.com”之类的网页响应时,您是否有同样的性能问题?
  • 您是否在调试模式下运行?在调试中需要 20-30 秒的请求在发布模式下往往是近乎瞬时的。

标签: c# httpwebrequest


【解决方案1】:

这个问题类似于 StackOverflow 上的另一篇文章: Stackoverflow-2519655(HttpWebrequest is extremely slow)

大多数时候问题出在代理服务器属性上。您应该将此属性设置为 null,否则对象将在直接访问源之前尝试搜索要使用的适当代理服务器。注意:此属性默认开启,因此您必须明确告诉对象不要执行此代理搜索。

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}

【讨论】:

  • upvoting,看起来 HttpClient 也是如此
【解决方案2】:

我在“第一次”尝试时有 30 秒的延迟 - JamesR 对另一篇提到将代理设置为 null 的帖子的引用立即解决了它!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url);
request.Proxy = null; // <-- this is the good stuff

...

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

【讨论】:

    【解决方案3】:

    您的网站是否有无效的 SSL 证书?试试添加这个

    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept);
    
    //... somewhere AlwaysAccept is defined as:
    
    using System.Security.Cryptography.X509Certificates;
    using System.Net.Security;
    
    public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
    

    【讨论】:

      【解决方案4】:

      您没有关闭您的请求。一旦达到允许的连接数,您就必须等待较早的连接超时。试试

      using (var response = g.GetResponse())
      {
          // do stuff with your response
      }
      

      【讨论】:

      • 允许连接的限制是多少?是2吗?
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 2020-08-26
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2012-11-01
      相关资源
      最近更新 更多