Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个WebRequest代码很慢?_C#_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# 为什么这个WebRequest代码很慢?

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

我要求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;
}
{
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状态。禁用此选项可以加快请求速度。