Frage

Ich bat um 100 Seiten, die alle 404. Ich schrieb

    {
    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;
}

Zwei Läufe zeigen, dauert es 00: 00: 30,7968750 und 00: 00: 26,8750000. Dann habe ich versucht, Firefox und verwenden Sie den folgenden Code

<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>

Mit meiner comp Zeit und Zählen sie rund 4 Sekunden betragen. 4 Sekunden ist 6.5-7.5faster dann meine App. Ich plane, durch eine Tausende von Dateien zu scannen, so 3,75 Stunden anstelle von 30 Minuten unter ein großes Problem wäre. Wie kann ich diesen Code schneller machen? Ich weiß, dass jemand sagen firefox die Bilder speichert, aber ich möchte 1) sagen, es muss noch die Header überprüfen von dem Remote-Server sehen, ob sie aktualisiert wurde (das ist, was ich möchte, dass meine App zu tun) 2) Ich bin nicht Empfangen des Körpers, sollte mein Code nur den Header anfordert werden. Also, wie löse ich das?

War es hilfreich?

Lösung

Wahrscheinlich gibt Firefox mehrere Anfragen auf einmal, während Ihr Code tut sie eins nach dem anderen. Vielleicht Hinzufügen von Threads werden Ihr Programm beschleunigen.

Andere Tipps

Ich habe bemerkt, dass ein HttpWebRequest auf der ersten Anforderung hängt. Ich habe einige Nachforschungen und was scheint, ist zu geschehen, dass die Anforderung der Konfiguration oder automatische Erkennung Proxies. Wenn Sie

request.Proxy = null;

auf dem Web-Request-Objekt, können Sie möglicherweise eine anfängliche Verzögerung zu vermeiden.

Mit Proxy automatisch erkennen:

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

Ohne Proxy automatisch erkennen:

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

Ihr Code auf asynchrone GetResponse ändern

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

Async Get

Die Antwort ändert HttpWebRequest / HttpWebResponse zu WebRequest / WebResponse nur. Das das Problem behoben.

Haben Sie versucht, die gleiche URL im Internet Explorer auf der Maschine öffnen, die Ihr Code bereitgestellt wird? Wenn es sich um eine Windows Server-Maschine ist dann manchmal ist es, weil die URL Sie anfordernden sind nicht in IE (die HttpWebRequest abarbeitet) Liste von sicheren Websites. Sie müssen nur es hinzufügen müssen.

Haben Sie weitere Informationen haben könnten Sie schreiben? Ich habe etwas zu tun, ähnlich und haben in Tonnen Probleme mit HttpWebRequest vor. Alle einzigartig. Also mehr Informationen helfen würden.

BTW, es mit Hilfe der asynchronen Methoden aufrufen in diesem Fall nicht wirklich helfen. Es ist nicht die Downloadzeit verkürzen. Es funktioniert einfach nicht blockiert Ihren aufrufende Thread das ist alles.

schließen Sie die Antwortstream, wenn Sie fertig sind, so in Ihrem checkExist (), fügen wresp.Close () nach wresp = (HttpWebResponse) wreq.GetResponse ();

OK, wenn Sie den Statuscode 404 für alle Web-Seiten werden immer dann ist es aufgrund nicht Anmeldeinformationen angeben. So müssen Sie fügen

wreq.Credentials = CredentialCache.DefaultCredentials;

Dann können Sie auch über Statuscode kommen = 500 für die Sie benötigen User Agent angeben. Welche etwas wie die unten Linie aussieht

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

"A WebClient Instanz optional HTTP-Header ist standardmäßig nicht senden. Wenn Ihre Anfrage einen optionalen Header erfordert, müssen Sie die Header an den Header Sammlung z. B. Abfragen in der Antwort zu erhalten, müssen Sie einen vom Benutzer hinzufügen Agent-Header. auch Server können zurückgeben 500 (Internal Server Error), wenn der User-Agent-Header fehlt. "

     

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

Um die Leistung der Verbesserung httpwebrequest Sie müssen hinzufügen

wreq.Proxy=null

Jetzt wird der Code wie folgt aussehen:

 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;

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top