J'ai récemment découvert que ce qui suit ne fonctionne pas avec certains sites, tels que IMDB.COM.
class Program { static void Main(string[] args) { try { System.Net.WebRequest wc = System.Net.WebRequest.Create("http://www.imdb.com"); //args[0]); ((HttpWebRequest)wc).UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.1 Safari/525.19"; wc.Timeout = 1000; wc.Method = "HEAD"; WebResponse res = wc.GetResponse(); var streamReader = new System.IO.StreamReader(res.GetResponseStream()); Console.WriteLine(streamReader.ReadToEnd()); } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
3 Réponses :
Vous devrez clarifier ce que vous entendez par «léger». Qu'est-ce que vous essayez d'accomplir? p>
si vous pouvez ou non utiliser get / Post / Tead / Suppr / Suppr / Supprimer dépend de l'URL et de ce qui est configuré dans l'application qui s'exécute sur le serveur à cette URL. P>
Si tout ce que vous essayez de faire est de voir si vous pouvez créer une connexion sans télécharger le contenu, vous pouvez peut-être essayer de simplement lancer une connexion au port 80 en utilisant sockets , mais il n'y a pas de manière vraiment fiable ou universellement prise en charge simplement en modifiant la méthode HTTP. P >
Eh bien, essentiellement ce que j'utilise la demande de la tête pour l'instant est a) de vérifier si un site existe réellement b) si un site existe, pour chaque lien dans l'intérieur, vérifiez qu'elles existe réellement (donc chaque image, une feuille de style, etc.). Par conséquent, sur certaines pages lourdes, elle pourrait littéralement être appelée des centaines de fois. Donc, par léger, je veux dire surtout le trafic réseau.
Droite ... La seule méthode plus légère que je pouvais penser en ce qui concerne la bande passante serait d'utiliser des sockets pour construire manuellement vos demandes HTTP, récupérez assez de la réponse pour déterminer le code d'état HTTP, puis fermez la connexion.
Entraînerait la voie de HTTP fabriqué à la main effectivement contourner les résultats d'erreur 405? Modifier: ER, Résultats du statut que j'aurais dû dire, je suppose techniquement http 405 n'est pas une erreur. Ce n'est qu'une poignée de sites qui rentrent 405, et je ne sais pas réellement quelle partie provoque cette réponse. En ce moment, je suppose que c'est la demande de la tête, mais je ne suis pas sûr.
La demande de tête est ce qui causerait la question. Ce que je veux dire par la demande HTTP artisanale de la main est que vous utiliseriez un get, ce que le serveur s'attendrait, mais que vous pourriez contrôler ce que vous téléchargez, vous pourriez télécharger uniquement les en-têtes de réponse puis terminer la connexion avant de télécharger le corps.
Ouvrez vous-même la connexion avec une prise (au lieu d'un HTTPRequest ou webclient ) et fermez le Flux dès que vous avez lu le code d'état. Heureusement, le code d'état s'approche du haut du flux de réponses :) P>
Si la tête retourne un 405, cela signifie que le serveur ne prend pas en charge la tête (au moins pour cette URL) et que vous aurez de retour pour obtenir à la place. La majorité des sites devraient supporter la tête, de sorte que vous voulez probablement faire la tête par défaut, mais si elle jette un 405, vous pourriez peut-être tomber pour obtenir pour ce domaine. Ou peut-être que vous voulez essayer la tête d'abord pour chaque demande; Ymmv. P>
Si le serveur nécessite d'obtenir et que vous souhaitez réduire le trafic réseau, vous pouvez essayer de faire un get conditionnel et / ou un get partiel (voir par exemple RFC2616 ). Je n'ai jamais essayé de faire ceux avec WebRequest mais je pense que cela vous permet d'ajouter des en-têtes HTTP sortants personnalisés, vous devriez donc pouvoir le faire. P>
Aussi, n'oubliez pas que, si vous écrivez une araignée (que vous êtes clairement), vous devez respecter les robots.txt du serveur. Il est également courtois pour accélérer vos demandes à quelque chose comme une demande toutes les deux secondes. , alors vous ne slashdotez pas le serveur. P>
Merci pour votre réponse. Je n'écris pas réellement une araignée, le produit final est de plus près de la nature à un navigateur Web que toute autre chose. J'ai fait comme vous l'avez suggéré plus tôt (demande de la tête, puis sur 405 un get complet), qui est ma façon actuelle de faire les choses, mais elle est sous-optimale. Je vais examiner partiellement obtient, ce serait probablement parfait. Merci.
Je devais augmenter le délai d'attente, mais le code que vous avez posté ci-dessus fonctionne pour moi. Le remplacer à la poste n'aurait aucun sens, car vous n'avez aucune donnée à poster. Et votre titre parle de la tête, mais vous ne faites pas une demande de tête. Veuillez clarifier la question de savoir quelle est la question, puisque votre code "cassé" fonctionne bien.
Ug, typo vraiment stupide dans le titre. Fixe maintenant ... exemple classique de penser une chose et tapez un autre. Lorsque vous exécutez le code ci-dessus, vous n'obtenez pas une réponse 405? EDIT: OK, j'ai compris même mon code était imparfait. Ce qui précède est ce que je voulais dire poster et est édité pour donner l'erreur 405 (et avoir un sens .....)