Je crée un programme simple en visuel c # 2005 qui recherche un symbole boursier sur Yahoo! Finance, télécharge les données historiques, puis trace l'historique des prix pour le symbole boursier spécifié.
Je connais l'URL exacte dont j'ai besoin pour acquérir les données, et si l'utilisateur entre un symbole boursier existant (ou au moins un avec des données sur Yahoo! Finance), cela fonctionne parfaitement. Cependant, j'ai une erreur d'exécution si l'utilisateur crée un symbole boursier, car le programme tente d'extraire des données d'une page Web inexistante.
J'utilise la classe WebClient et la fonction DownloadString. J'ai parcouru toutes les autres fonctions membres de la classe WebClient, mais je n'ai rien vu que je pourrais utiliser pour tester une URL.
Comment puis-je faire ceci?
la source
Réponses:
Vous pourriez émettre une demande "HEAD" plutôt qu'un "GET"?
(modifier) - lol! On dirait que j'ai déjà fait ça ! changé en wiki pour éviter les accusations de collecte de représentants. Donc, pour tester une URL sans le coût du téléchargement du contenu:
Vous devriez
try
/catch
autour duDownloadString
pour vérifier les erreurs; pas d'erreur? Ça existe...Avec C # 2.0 (VS2005):
et
la source
Voici une autre implémentation de cette solution:
De: http://www.dotnetought.net/2009/10/14/how-to-check-remote-file-exists-using-c/
la source
Ces solutions sont plutôt bonnes, mais elles oublient qu'il peut y avoir d'autres codes d'état que 200 OK. C'est une solution que j'ai utilisée sur des environnements de production pour la surveillance de l'état et autres.
S'il y a une redirection d'url ou une autre condition sur la page cible, le retour sera vrai en utilisant cette méthode. De plus, GetResponse () lèvera une exception et vous n'obtiendrez donc pas de StatusCode pour cela. Vous devez intercepter l'exception et rechercher une ProtocolError.
Tout code d'état 400 ou 500 renverra faux. Tous les autres retournent vrai. Ce code est facilement modifié pour répondre à vos besoins de codes d'état spécifiques.
la source
HttpWebRequest
je n'aime pas ça si vous ne faites pas.Close()
l'response
objet avant d'essayer de télécharger autre chose. Il a fallu des heures pour trouver celui-là!HttpWebResponse
L'objet doit être enfermé dans unusing
bloc car il implémenteIDisposable
ce qui assurera également la fermeture de la connexion. Cela pourrait poser des problèmes comme @jbeldock, a été confronté.Head
, cette ressourceGet
pourrait ne pas être prise en charge. Il aurait dû lancer 405 à la place.Si je comprends bien votre question, vous pouvez utiliser une petite méthode comme celle-ci pour vous donner les résultats de votre test d'URL:
Vous pouvez envelopper le code ci-dessus dans une méthode et l'utiliser pour effectuer la validation. J'espère que cela répond à la question que vous posiez.
la source
Essayez ceci (assurez-vous d'utiliser System.Net):
Lorsque la fonction checkWebsite () est appelée, elle essaie d'obtenir le code source de l'URL qui lui est passé. S'il obtient le code source, il renvoie true. Sinon, il renvoie false.
Exemple de code:
la source
Voici une autre option
la source
Cette solution semble facile à suivre:
la source
la source
J'ai un moyen plus simple de déterminer la météo qu'une URL est valide.
la source
J'ai toujours trouvé que les exceptions sont beaucoup plus lentes à être traitées.
Peut-être qu'une manière moins intensive permettrait d'obtenir un meilleur résultat plus rapide?
Ensuite, utilisez simplement:
la source
Les serveurs Web répondent avec un code d'état HTTP indiquant le résultat de la demande, par exemple 200 (parfois 202) signifie succès, 404 - non trouvé, etc. (voir ici ). En supposant que la partie adresse du serveur de l'URL est correcte et que vous n'obtenez pas de délai d'expiration de socket, l'exception vous indique très probablement que le code d'état HTTP était différent de 200. Je suggérerais de vérifier la classe de l'exception et de voir si l'exception porte le code d'état HTTP.
IIRC - L'appel en question lève une WebException ou un descendant. Vérifiez le nom de la classe pour voir lequel et encapsulez l'appel dans un bloc try pour intercepter la condition.
la source
À la suite des exemples déjà donnés, je dirais, il est préférable d'envelopper également la réponse dans une utilisation comme celle-ci
la source