我要求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);
}
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并使用以下代码
<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>
使用我的计算时间并计算它大约是4秒。 4秒是6.5-7.5faster然后我的应用程序。我打算扫描成千上万的文件,因此花费3.75小时而不是30分钟将是一个大问题。如何让这段代码更快?我知道有人会说firefox缓存图像,但我想说1)它仍然需要检查远程服务器的标头,看看它是否已更新(这是我想要我的应用程序做)2)我不是收到正文,我的代码应该只是请求标题。那么,我该如何解决这个问题?
答案 0 :(得分:52)
我注意到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
{
}
答案 1 :(得分:4)
将您的代码更改为异步getresponse
public override WebResponse GetResponse() {
•••
IAsyncResult asyncResult = BeginGetResponse(null, null);
•••
return EndGetResponse(asyncResult);
}
答案 2 :(得分:2)
Firefox可能会同时发出多个请求,而您的代码会逐个发出。也许添加线程可以加快你的程序。
答案 3 :(得分:1)
答案是仅将HttpWebRequest / HttpWebResponse更改为WebRequest / WebResponse。这解决了问题。
答案 4 :(得分:0)
您是否尝试在部署代码的计算机上的IE中打开相同的URL?如果它是Windows Server计算机,那么有时它是因为您请求的URL不在IE(HttpWebRequest工作)的安全站点列表中。你只需要添加它。
您可以发布更多信息吗?我做过类似的事情,之前遇到过HttpWebRequest的大量问题。一切都很独特所以更多信息会有所帮助。
顺便说一句,在这种情况下,使用异步方法调用它并不会真正有用。它不会缩短下载时间。它只是不会阻止你的调用线程。答案 5 :(得分:0)
完成后关闭响应流,所以在checkExist()中,在wresp =(HttpWebResponse)之后添加wresp.Close()wreq.GetResponse();
答案 6 :(得分:0)
如果您为所有网页获取状态代码404,那么它是由于未指定凭据。所以你需要添加
wreq.Credentials = CredentialCache.DefaultCredentials;
然后,您可能还会遇到状态码= 500,因为您需要指定用户代理。看起来像下面这行
wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
&#34;默认情况下,WebClient实例不会发送可选的HTTP标头。如果您的请求需要可选标头,则必须将标头添加到Headers集合中。例如,要在响应中保留查询,必须添加用户代理标头。此外,如果缺少用户代理标头,服务器可能会返回500(内部服务器错误)。&#34;
参考: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;
}
答案 7 :(得分:0)
设置cookie很重要,您必须像这样的代码添加public interface FileUploadService {
@Multipart
@POST("/upload")
void upload(@Part("myfile") TypedFile file,
@Part("description") String description,
Callback<String> cb);
}
AspxAutoDetectCookieSupport=1