为什么这个WebRequest代码会变慢?

我要求100页,全部404.我写了

{ var s = DateTime.Now; for(int i=0; i < 100;i++) DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg"); var e = DateTime.Now; var d = es; d=d; Console.WriteLine(d); } static public bool CheckExist(string url) { HttpWebRequest wreq = null; HttpWebResponse wresp = null; bool ret = false; try { wreq = (HttpWebRequest)WebRequest.Create(url); wreq.KeepAlive = true; wreq.Method = "HEAD"; wresp = (HttpWebResponse)wreq.GetResponse(); ret = true; } catch (System.Net.WebException) { } finally { if (wresp != null) wresp.Close(); } return ret; } 

两次运行显示需要00:00:30.7968750和00:00:26.8750000。 然后我尝试使用firefox并使用以下代码

    for(var i=0; i<100; i++) document.write("
");

使用我的计算时间并计算它大约是4秒。 4秒是6.5-7.5faster然后我的应用程序。 我打算扫描成千上万的文件,所以花费3.75小时而不是30分钟将是一个大问题。 如何让这段代码更快? 我知道有人会说firefox缓存图像,但我想说1)它仍然需要检查远程服务器的标头,看它是否已更新(这是我想要我的应用程序做的)2)我不是收到正文,我的代码应该只是请求标题。 那么,我该如何解决这个问题呢?

可能Firefox会一次发出多个请求,而您的代码会逐个发出。 也许添加线程会加快你的程序。

我注意到HttpWebRequest在第一个请求时挂起。 我做了一些研究,似乎正在发生的事情是请求正在配置或自动检测代理。 如果你设置

 request.Proxy = null; 

在Web请求对象上,您可以避免初始延迟。

使用代理自动检测:

 using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms { } 

没有代理自动检测:

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

将您的代码更改为异步getresponse

 public override WebResponse GetResponse() { ••• IAsyncResult asyncResult = BeginGetResponse(null, null); ••• return EndGetResponse(asyncResult); } 

异步获取

答案是仅将HttpWebRequest / HttpWebResponse更改为WebRequest / WebResponse。 这解决了问题。

您是否尝试在部署代码的计算机上在IE中打开相同的URL? 如果它是Windows Server计算机,那么有时它是因为您请求的URL不在IE的(HttpWebRequest工作)安全站点列表中。 你只需要添加它。

你有更多可以发布的信息吗? 我做过类似的事情,之前遇到过HttpWebRequest的大量问题。 一切都很独特 所以更多信息会有所帮助。

顺便说一句,在这种情况下使用异步方法调用它并不会真正有用。 它不会缩短下载时间。 它只是不会阻止你的调用线程。

完成后关闭响应流,所以在checkExist()中,在wresp =(HttpWebResponse)之后添加wresp.Close()wreq.GetResponse();

好的,如果您为所有网页获取状态代码404,那么它是由于未指定凭据。 所以你需要添加

 wreq.Credentials = CredentialCache.DefaultCredentials; 

然后,您可能还会遇到状态码= 500,因为您需要指定用户代理。 看起来像下面这行

 wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0"; 

“默认情况下,WebClient实例不会发送可选的HTTP标头。如果您的请求需要可选标头,则必须将标头添加到Headers集合中。例如,要在响应中保留查询,您必须添加用户代理标头。此外,如果缺少用户代理标头,服务器可能会返回500(内部服务器错误)。“

参考: https : //msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

要提高HttpWebrequest的性能,您需要添加

 wreq.Proxy=null 

现在代码看起来像:

  static public bool CheckExist(string url) { HttpWebRequest wreq = null; HttpWebResponse wresp = null; bool ret = false; try { wreq = (HttpWebRequest)WebRequest.Create(url); wreq.Credentials = CredentialCache.DefaultCredentials; wreq.Proxy=null; wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0"; wreq.KeepAlive = true; wreq.Method = "HEAD"; wresp = (HttpWebResponse)wreq.GetResponse(); ret = true; } catch (System.Net.WebException) { } finally { if (wresp != null) wresp.Close(); } return ret; 

}