C# 为什么这个WebRequest代码很慢?
我要求100页,全部404页。我写C# 为什么这个WebRequest代码很慢?,c#,httpwebrequest,httpwebresponse,C#,Httpwebrequest,Httpwebresponse,我要求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 = e-s; d=d; Console.WriteLine(d); } st
{
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 = e-s;
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;
}
{
var s=DateTime.Now;
对于(int i=0;i<100;i++)
DL.CheckExist(“http://google.com/lol“+i.ToString()+”.jpg”);
var e=DateTime.Now;
var d=e-s;
d=d;
控制台写入线(d);
}
静态公共bool CheckExist(字符串url)
{
HttpWebRequest wreq=null;
HttpWebResponse wresp=null;
bool-ret=假;
尝试
{
wreq=(HttpWebRequest)WebRequest.Create(url);
wreq.KeepAlive=true;
wreq.Method=“HEAD”;
wresp=(HttpWebResponse)wreq.GetResponse();
ret=真;
}
捕获(System.Net.WebException)
{
}
最后
{
如果(wresp!=null)
wresp.Close();
}
返回ret;
}
两次运行显示需要00:00:30.7968750和00:00:26.8750000。然后我尝试firefox并使用以下代码
<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>
</body>
</html>
对于(var i=0;iFirefox可能会一次发出多个请求,而您的代码会一个接一个地发出请求。添加线程可能会加快程序的速度。将代码更改为异步getresponse
public override WebResponse GetResponse() {
•••
IAsyncResult asyncResult = BeginGetResponse(null, null);
•••
return EndGetResponse(asyncResult);
}
您是否尝试在部署代码的计算机上的IE中打开相同的URL?如果它是Windows Server计算机,则有时是因为您请求的URL不在IE的(HttpWebRequest关闭的)安全站点列表中。您只需添加它即可
你有更多的信息可以发布吗?我也做过类似的事情,以前在HttpWebRequest上遇到过很多问题。都是独一无二的。所以更多的信息会有所帮助
顺便说一句,在这种情况下,使用异步方法调用它并没有真正的帮助。它不会缩短下载时间。它只是不会阻止调用线程而已。我注意到一个HttpWebRequest
挂起在第一个请求上。我做了一些研究,结果似乎是请求正在配置或自动检测ng代理。如果您设置
request.Proxy = null;
在web请求对象上,您可能能够避免初始延迟
使用代理自动检测:
using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}
无代理自动检测:
using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}
答案是将HttpWebRequest/HttpWebResponse更改为WebRequest/WebResponse only。这解决了问题。完成后关闭响应流,因此在checkExist()中,在wresp=(HttpWebResponse)wreq.GetResponse()之后添加wresp.close()确定如果所有网页的状态代码都是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(内部服务器错误)
参考:
要提高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;
}设置cookie很重要,您必须像下面的代码一样添加AspxAutoDetectCookieSupport=1
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = target.Host });
好的观点。网站接受超过3个线程吗?这就解释了为什么一个网站可能会快3-4倍,但不会超过6.5。嗯。我会记住这一点,并在今晚再试一次。所以我检查了另一个应用程序,我测试的一个网站可以处理8个线程。这就解释了。如果这是唯一的原因,我会有点尴尬。也许只是firefox一次发出3个请求。是的,但您现在也可以在一行代码中完成。WebClient.downloadstringasync如果您想实现这一点,而不仅仅是为了下载,我尝试了IE6,大约需要5秒钟。我的代码使用=wreq.Method=“HEAD”;取12.5。我假设它的bc使用2个线程。这些数据看起来足够接近。注意到你提到你的请求页面是404。之前没有故意这样做,但WebRequest行为在这种情况下可能会有所不同。值得一看。如果你使用G请求现有页面,是否需要正常的4秒ET?当我在我的代码请求中放入这一行时。Proxy=null;我能够立即得到结果!Thanx如果请求需要在某些客户端站点通过代理,会产生什么后果?它还会知道它需要获得代理吗?我不知道。代理自动检测似乎很慢(或者说,这已经超过2年了),这将禁用它。我猜如果设置此标志,它将无法正确检测代理。在凌晨1点,我正在碰壁,调试线程代码,试图找出导致某些请求花费太长时间的原因。而proxy=null
则起到了解救作用!非常感谢!!!有时它可以帮助设置Expect100Ccontinue to false,在服务器/服务支持的情况下加快webrequests的速度:ServicePointManager.Expect100Continue=false;
默认情况下,在每次查询之前发送continue 100状态。禁用此选项可以加快请求速度。