Ich mache ein einfaches Programm in Visual C # 2005, das ein Aktiensymbol auf Yahoo! Finanzen, lädt die historischen Daten herunter und zeichnet dann den Preisverlauf für das angegebene Tickersymbol.
Ich kenne die genaue URL, die ich zum Erfassen der Daten benötige, und wenn der Benutzer ein vorhandenes Tickersymbol (oder mindestens eines mit Daten auf Yahoo! Finance) eingibt, funktioniert dies einwandfrei. Ich habe jedoch einen Laufzeitfehler, wenn der Benutzer ein Tickersymbol erstellt, da das Programm versucht, Daten von einer nicht vorhandenen Webseite abzurufen.
Ich verwende die WebClient-Klasse und die DownloadString-Funktion. Ich habe alle anderen Mitgliedsfunktionen der WebClient-Klasse durchgesehen, aber nichts gefunden, mit dem ich eine URL testen könnte.
Wie kann ich das machen?
quelle
Antworten:
Sie könnten eher eine "HEAD" -Anforderung als eine "GET" -Anforderung ausgeben ?
(bearbeiten) - lol! Sieht so aus, als hätte ich das schon mal gemacht ! wurde in das Wiki geändert, um Vorwürfe der Wiederholung zu vermeiden. So testen Sie eine URL ohne die Kosten für das Herunterladen des Inhalts:
Sie würden
try
/catch
um dieDownloadString
auf Fehler prüfen; kein Fehler? Es existiert...Mit C # 2.0 (VS2005):
und
quelle
Hier ist eine weitere Implementierung dieser Lösung:
Von: http://www.dotnetehowts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
quelle
Diese Lösungen sind ziemlich gut, aber sie vergessen, dass es möglicherweise andere Statuscodes als 200 OK gibt. Dies ist eine Lösung, die ich in Produktionsumgebungen zur Statusüberwachung und dergleichen verwendet habe.
Wenn auf der Zielseite eine URL-Umleitung oder eine andere Bedingung vorliegt, ist die Rückgabe mit dieser Methode wahr. Außerdem löst GetResponse () eine Ausnahme aus und daher erhalten Sie keinen StatusCode dafür. Sie müssen die Ausnahme abfangen und nach einem ProtocolError suchen.
Jeder 400- oder 500-Statuscode gibt false zurück. Alle anderen kehren wahr zurück. Dieser Code kann leicht an Ihre Anforderungen für bestimmte Statuscodes angepasst werden.
quelle
HttpWebRequest
gefällt mir nicht, wenn Sie.Close()
dasresponse
Objekt nicht verwenden, bevor Sie versuchen, etwas anderes herunterzuladen. Es hat Stunden gedauert, diesen zu finden!HttpWebResponse
Das Objekt sollte in einemusing
Block eingeschlossen sein , da es implementiert,IDisposable
wodurch auch das Schließen der Verbindung sichergestellt wird. Dies kann zu Problemen führen, mit denen @jbeldock konfrontiert ist.Head
wird diese Ressource möglicherweise nicht unterstütztGet
. Es hätte stattdessen 405 werfen sollen.Wenn ich Ihre Frage richtig verstehe, können Sie eine kleine Methode wie diese verwenden, um die Ergebnisse Ihres URL-Tests zu erhalten:
Sie können den obigen Code in eine Methode einbinden und damit eine Validierung durchführen. Ich hoffe, dies beantwortet die Frage, die Sie gestellt haben.
quelle
Versuchen Sie Folgendes (stellen Sie sicher, dass Sie System.Net verwenden):
Wenn die Funktion checkWebsite () aufgerufen wird, wird versucht, den Quellcode der übergebenen URL abzurufen. Wenn der Quellcode abgerufen wird, wird true zurückgegeben. Wenn nicht, wird false zurückgegeben.
Codebeispiel:
quelle
Hier ist eine weitere Option
quelle
Diese Lösung scheint leicht zu folgen:
quelle
quelle
Ich habe eine einfachere Möglichkeit, das Wetter zu bestimmen, für das eine URL gültig ist.
quelle
Ich habe immer festgestellt, dass Ausnahmen viel langsamer behandelt werden.
Vielleicht würde ein weniger intensiver Weg zu einem besseren, schnelleren Ergebnis führen?
Dann benutze einfach:
quelle
Webserver antworten mit einem HTTP-Statuscode, der das Ergebnis der Anforderung angibt, z. B. 200 (manchmal 202) bedeutet Erfolg, 404 - nicht gefunden usw. (siehe hier ). Angenommen, der Teil der Serveradresse in der URL ist korrekt und Sie erhalten kein Socket-Timeout. Die Ausnahme teilt Ihnen höchstwahrscheinlich mit, dass der HTTP-Statuscode nicht 200 war. Ich würde empfehlen, die Klasse der Ausnahme zu überprüfen und festzustellen, ob die Ausnahme vorliegt den HTTP-Statuscode.
IIRC - Der betreffende Aufruf löst eine WebException oder einen Nachkommen aus. Überprüfen Sie den Klassennamen, um festzustellen, welcher, und schließen Sie den Aufruf in einen try-Block ein, um die Bedingung abzufangen.
quelle
In Anlehnung an die bereits gegebenen Beispiele würde ich sagen, dass es empfehlenswert ist, die Antwort auch in eine Verwendung wie diese zu verpacken
quelle