HttpWebRequest vs Webclient (Spezialszenario)

7

Ich weiß, dass diese Frage bereits in diesem Thread beantwortet wurde, aber ich konnte es nicht scheinen die Details zu finden.

In meinem Szenario baue ich eine Konsolenanwendung, die die HTML-Seitenquelle für Änderungen im Auge behält. Wenn irgendeine Aktualisierung / Änderung auftritt, werde ich weitere Operationen durchführen. Darüber hinaus werde ich auch nach jeder Sekunde eine Anfrage durchführen, oder sobald die vorherige Anfrage beendet ist.

Ich kann nicht herausfinden, ob ich HttpWebRequest oder WebClient zum Herunterladen der HTML-Seitenquelle verwenden und einen Vergleich durchführen soll. Was wäre Ihrer Meinung nach eine ideale Lösung für mich? Geschwindigkeit und Zuverlässigkeit beide:)

    
code master 04.06.2011, 21:21
quelle

2 Antworten

14

Ich würde mit HttpWebRequst gehen, weil es nicht so abstrahiert ist und Sie mit HTTP-Parametern ziemlich herumspielen können. Es bietet Ihnen die Möglichkeit, die gesamte Seite nicht herunterzuladen, wenn der Server beispielsweise "Datei nicht geändert" zurückgibt.

Wenn Sie Ihrer Anfrage einige Parameter hinzufügen, wie IfModifiedSince (es könnte HEAD oder GET Anfrage sein) der Server kann den Antwortcode 304 - NICHT MODIFIED zurückgeben. Weitere Informationen finden Sie in der Beschreibung des Caching in HTTP .

Es geht darum, sicherzustellen, dass Sie nur die gesamte Seite herunterladen, wenn sie seit dem letzten Abruf tatsächlich geändert wurde. Die meiste Zeit wird es nicht geändert (ich denke, kann nicht sicher wissen, ohne Ihre Domäne zu kennen), so dass Sie nur eine leichte Antwort vom Server erhalten müssen, die einfach sagt, "nichts hat sich hier geändert".

Update: Codebeispiel, das die Verwendung von IfModifiedSince property:

demonstriert %Vor%

Diese Methode sollte true zurückgeben, wenn die Seite seit dateTime date und false geändert wurde, wenn dies nicht der Fall war. GetResponse methode wird ein WebException werfen, wenn Sie einen HEAD- Anfrage und der Server gibt 304 - NICHT MODIFIED zurück (was irgendwie unglücklich ist). Wir müssen sicherstellen, dass es sich nicht um ein anderes Problem mit der Webverbindung handelt. Aus diesem Grund überprüfe ich den Status der Webausnahme und den HTTP-Status als Antwort. Wenn irgendetwas anderes eine Ausnahme verursacht, wir werfen es einfach weiter.

%Vor%

Dieser Beispielcode erzeugt die Ausgabe:

%Vor%

Hinweis: Lesen Sie Jim Mischels Zusatz zu dieser Antwort , da er nur wenige gibt gute Ratschläge zu dieser Technik.

    
Dyppl 04.06.2011, 21:30
quelle
9

Ich wollte dies als Kommentar zu @ Dyppls Antwort hinterlassen, aber es wurde zu lang.

Dyppls Antwort ist im Allgemeinen ein guter Rat und die Art, wie ich dieses Problem angehen würde. Es gibt jedoch ein paar Dinge, die Sie beachten sollten.

Erstens gibt es keinen Grund, eine HEAD -Anfrage zu machen, gefolgt von einer GET , wenn die Seite geändert wurde. Sie können GET mit dem Headersatz IfModifiedSince ausführen, und der Server gibt entweder die gesamte Seite oder eine 304 zurück. Wenn zuerst HEAD gefolgt von 'GET' ausgeführt wird, werden zwei Anfragen an den Server gestellt , die einen großen Teil des Zwecks der bedingten Anfrage vereitelt.

Zweitens sollten Sie die Eigenschaft IfModifiedSince auf den Wert LastModified setzen, der von der vorherigen Antwort zurückgegeben wurde (d. h. HttpWebResponse.LastModified ), da die Zeit des Servers möglicherweise nicht mit Ihrem Computer synchronisiert ist. Außerdem habe ich festgestellt, dass ein Großteil der Seiten, insbesondere solche mit generierten Inhalten (wie WordPress-Blogs) liegen. Sie geben immer das aktuelle Datum / die aktuelle Uhrzeit im Header LastModified zurück. Daher ist es nicht vorteilhaft, die If-Modified-Since Prüfung auf diesen Websites durchzuführen.

Wenn Sie wissen, dass die Site liegt und immer das aktuelle Datum / die aktuelle Uhrzeit zurückgibt, können Sie den Header ContentLength , der beim Herunterladen von der Seite zurückgegeben wird, nachverfolgen. Wenn Sie dann überprüfen möchten, ob sich die Seite geändert hat, führen Sie eine HEAD -Anforderung aus und überprüfen Sie den zurückgegebenen ContentLength -Header mit dem gespeicherten Wert. Wenn sie übereinstimmen, ist es unwahrscheinlich, dass sich die Seite geändert hat. Wenn sie nicht übereinstimmen, führen Sie eine GET -Anforderung aus, um Ihre Kopie der Seite zu aktualisieren und die neue ContentLength beizubehalten.

Diese Technik hat den Nachteil, dass zwei Anforderungen erforderlich sind, wenn sich die Seite geändert hat. Es ist auch nicht 100% zuverlässig auf allen Servern. Einige geben eine andere ContentLength für die Anfrage HEAD zurück, und einige geben keine gültige ContentLength zurück. Das heißt, ich habe festgestellt, dass es für eine große Anzahl von Websites effektiv ist.

    
Jim Mischel 06.06.2011 14:58
quelle

Tags und Links