Tester l'existence d'une ressource avec une requête http
Par amethyste le Déc 27, 2008 | Dans focus | 1 réaction »
Dernier blog de l'année.
Lorsque le navigateur rencontre une ressource qui n'existe pas dans son script HTML il lève selon le cas une exception ou affiche un petit carré rouge bien connu (image par exemple). Au niveau des logs on voit apparaître une erreur http 404.
Ce comportement est parfois gênant en particulier pour la mise en page. On peut donc souhaiter faire un test côté serveur avant de réaliser le rendu de la page.
Si la ressource fait partie du site ou de la base de données sous jacente c'est assez simple, mais que se passe t'il s'il s'agit d'une image installée sur un autre serveur?
On peut alors être tenté d'écrire un code de ce genre:
public static bool CheckImageExists(string url) { WebResponse response = null; try { WebRequest request = HttpWebRequest.Create(url); response = request.GetResponse(); // la ressource existe return true; } catch (WebException) { return false; } finally { if (response != null) { response.Close(); } } }
On passe à la méthode l'url de la ressource à tester et on fait une requête http. Une exception Web avec le statut 404 est levée si les choses se passent mal (ou tout autre exception si les choses se passent très mal!). Il ne reste plus qu'à implémenter la logique de comportement selon le statut du retour de la fonction.
Cela fonctionne très bien si la ressource n'existe pas. Dans la négative cela fonctionne TROP bien...
On a certes notre résultat, mais on a remonté la ressource complète juste pour tester son existence et ce travail devra être fait une deuxième fois par le navigateur client.
Même si on ne parle pas d'une vidéo il n'est pas certain que l'on optimise l'utilisation de la bande passante!
Voici une version légèrement modifiée qui résout ce problème:
public static bool CheckImageExists(string url) { WebResponse response = null; try { WebRequest request = HttpWebRequest.Create(url); // pour ne lire que le header, pas les données request.Method = "HEAD"; response = request.GetResponse(); // la ressource existe return true; } catch (WebException) { return false; } finally { if (response != null) { response.Close(); } } }
La différence est que la méthode de la requête est maintenant HEAD ce qui demande au serveur Web de ne transférer que la partie header de la requête. Le flux est considérablement allégé.
Bibliographie
Ben oui, j'ai pas la science infuse. C'est même le client qui a trouvé ceci:
http://blogs.microsoft.co.il/blogs/dorr/archive/2008/09/02/how-to-check-if-a-file-exists-over-http.aspx
1 commentaire
Ceci étant dit, je pense que le GET ne ramène pas la resource complète tant que rien ne lit le stream. Il faudrait analyser un peu plus, je n'ai pas testé.
Laisser un commentaire
| « Trucs en vrac pour démarrage en douceur | Histoire de chemin virtuel » |