2009-05-25 5 views

Répondre

11

Vous pouvez simplement faire une requête HEAD au lieu d'un article complet/GET

que vous obtiendrez les en-têtes pour cette page qui devrait inclure le type de contenu. A partir de ce que vous devriez être en mesure de distinguer si son texte/html ou xml

Theres un bon exemple here on SO

+3

+1 la réponse parfaite et la raison exacte de l'existence de la requête HEAD –

+2

Juste un petit rappel que certains serveurs ne supportent pas HEAD, alors n'oubliez pas de revenir à GET/POST en cas d'échec –

+0

Je compte un "pourrait" et deux "devraient". ;] – bzlm

-3

il suffit de le lire dans un lecteur "texte". puis décider ce qui est le meilleur, par exemple, la recherche de certaines étiquettes vient à l'esprit;) puis le jeter dans votre lecteur réel.

ou est-ce trop simple?

+0

Il a spécifiquement dit qu'il voulait savoir avant de télécharger le fichier entier. –

2

Vous pouvez utiliser l'en-tête Content-Type et pour économiser la bande passante, vous pouvez forcer le serveur Web à vous servir une partie spécifique d'un document. Si le serveur inclut l'en-tête Accept-Ranges: bytes dans sa réponse, vous pouvez utiliser Range: bytes=0-10 pour télécharger uniquement les dix premiers octets (ou même essayer de ne rien télécharger).

Recherche également HEAD verbe au lieu de GET.

+0

+1 J'étais sur le point de suggérer le type de contenu ;-) – Shoban

0

Vous ne pouvez pas savoir quel type de fichier il est juste en regardant l'URL.

Je suggère que vous essayez de vérifier le type MIME du document que vous demandez, ou lisez la première ligne et espérons que l'auteur a mis dans un Doctype.

5

Faisant suite à la réponse de Eoin Campbell, voici un extrait de code qui devrait faire exactement cela en utilisant la fonctionnalité System.Net: Bien entendu, cela suppose que le serveur Web publie le type de contenu (MIME) et le fait correctement. Mais puisque vous avez déclaré que vous voulez une manière efficace de bande passante de le faire, je suppose que vous ne voulez pas télécharger tout le balisage et analyser cela! Pour être honnête, le type de contenu est généralement défini correctement dans tous les cas.

+0

Vous pouvez simplement utiliser response.ContentType; –

+0

@Matthew: Bonne observation. Post édité. – Noldorin

+1

Cela répond exactement la moitié de la question. Il y a quelques types de contenu difficiles, comme: http://www.w3.org/TR/xhtml-media-types/#application-xhtml-xml – bzlm

1

Vérifiez les en-têtes de votre objet HttpWebResponse. L'en-tête Content-Type doit lire text/xml pour un document XML/RSS et text/html pour une page Web standard.

0

D'une manière générale, c'est impossible. C'est parce qu'il est possible (bien que peu utile) de servir des fichiers HTML ou XML en tant que application/octet-stream. En outre, comme indiqué par d'autres, il existe plusieurs types MIME XML valides. Cependant, une requête HEAD puis vérification de type de contenu peut parfois fonctionner:

WebRequest req = WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
req.Method = "HEAD"; 
String contentType = resp.ContentType; 

if(contentType == "text/xml") 
    getXML(url); 
else if(contentType == "text/html") 
    getHTML(url); 

Mais si vous allez le traiter en quelque sorte de toute façon, vous pouvez le faire:

WebRequest req = WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
String contentType = resp.ContentType; 

if(contentType == "text/xml") 
    processXML(resp.GetResponseStream()); 
else if(contentType == "text/html") 
    processHTML(resp.GetResponseStream()); 
else 
    // process error condition 

Gardez à l'esprit, les fichiers sont téléchargé au besoin.Donc, demander simplement l'objet réponse ne provoque pas le téléchargement du fichier entier.

Questions connexes