10
votes

Comment vérifier si un fichier existe sur un serveur Web par son URL?

Dans notre application, nous avons une aide en ligne. Il fonctionne vraiment simple: si l'utilisateur clique sur le bouton Aide, une URL est créée en fonction de la langue actuelle et de l'aide au contexte (par exemple, " http://example.com/help/ "+ [lang_id] +" [help_context]) et appelé dans le navigateur.

Donc, ma question est la suivante: comment puis-je vérifier si un fichier existe sur le serveur Web sans charger le contenu complet du fichier?

Merci pour votre aide!

Mise à jour: Merci pour votre aide. Ma question a été répondue. Maintenant, nous avons des problèmes d'authentification de proxy et ne peuvent pas envoyer la demande HTTP;)


0 commentaires

7 Réponses :


1
votes

Envoyez une demande de tête pour l'URL (au lieu d'un get). Le serveur retournera un 404 s'il n'existe pas.


0 commentaires

0
votes

Edit: Apparemment, une bonne méthode pour ce faire serait une demande de tête.

Vous pouvez également créer une application côté serveur qui stocke le nom de chaque page Web disponible sur le serveur. Votre application client pourrait ensuite interroger cette application et répondre un peu plus rapidement qu'une requête complète de la page et sans lancer une erreur 404 chaque fois que le fichier n'existe pas.


1 commentaires

Ce n'est pas vrai - la demande de tête fait exactement cela.



20
votes

Vous pouvez utiliser .NET pour faire une demande de tête, puis regarder le statut de la réponse.

Votre code ressemblerait à ceci (adapté de la demande de tête HTTP ): p>

// create the request
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

// instruct the server to return headers only
request.Method = "HEAD";

// make the connection
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

// get the status code
HttpStatusCode status = response.StatusCode;


4 commentaires

Je ne suis pas khow pourquoi ne pas avoir travaillé pour moi. Mais j'ai changé de code et c'est OK Demande WebRequest = WebRequest.create (URL); demande.method = "tête"; Httpwebrevonse réponse = (httpwebrevonse) demande.getresponse (); HTTPSTAUSCODE Statut = Response.StatusTuscode; Quoi qu'il en soit, merci beaucoup.


Stackoverflow.com/Questtions/192085/...


Si cela vous donne le serveur distant renvoyé une erreur: (401) non autorisée en raison de la configuration de certains serveurs, supprimez la requête .method = "tête"; ligne;


Vous devez envelopper le demande.getresponse () à l'intérieur d'une prise de vue car vous pourriez recevoir une réception Web (par exemple, vous pouvez recevoir une exception de le serveur distant renvoyé une erreur: (403) interdit. < / code> lorsque vous essayez de faire de la demande.GetResponse ()



2
votes

Pouvons-nous supposer que vous exécutez votre application Web sur le même serveur Web que vous récupérez vos pages d'aide? Si oui, vous pouvez utiliser la méthode serveur.mapath pour trouver un chemin d'accès au fichier sur le serveur combiné à la méthode Fichier.exists à partir de l'espace de noms System.IO pour confirmer que le fichier existe.


2 commentaires

Non, j'exécute une application client de bureau qui tente de vérifier ce fichier sur un serveur Web distant.


Ah Ok, bien dans ce cas, je suis sûr que la réponse dont vous avez besoin a été fournie par les autres boursiers ici déjà.



0
votes

Si vous souhaitez vérifier l'état d'un document sur le serveur:

function fetchStatus(address) {
 var client = new XMLHttpRequest();
 client.onreadystatechange = function() {
  // in case of network errors this might not give reliable results
  if(this.readyState == 4)
   returnStatus(this.status);
 }
 client.open("HEAD", address);
 client.send();
}


0 commentaires

1
votes

Jetez un coup d'oeil au HTTPWEBRESPONSE classe . Vous pouvez faire quelque chose comme ceci: xxx


0 commentaires

2
votes

eu le même problème moi-même et a trouvé cette question et les réponses ici vraiment utiles.

mais les réponses ici utilisent l'ancien WEBREQUEST-Class qui est un peu obsolète, il n'a aucun support asynchronisé pour les démarreurs. Je voulais donc utiliser la façon la plus moderne de le faire avec httpclient . Voici un exemple avec une petite classe d'assistance pour vérifier si le fichier existe: xxx

utilisation: xxx


0 commentaires