WebRequest “TÊTE” poids léger alternative
J'ai récemment découvert que le code suivant 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);
}
}
}
Elle renvoie un HTTP 405 ( Méthode Non Autorisée ). Mon problème est que j'ai utiliser le code très similaire à la ci-dessus pour vérifier si un lien est valide et la grande majorité des cas, il fonctionne correctement. Je peux passer à la méthode de l'égalité OBTENIR et il fonctionne ( avec une augmentation du délai d'attente ), mais cela ralentit les choses d'un ordre de grandeur. Je suis en supposant que la 405 réponse est d'une configuration de serveur sur IMDB du côté serveur.
Est-il un moyen pour moi de faire la même chose que ci-dessus, dans un peu de poids manière .NET? Ou, est-il un moyen de corriger le code ci-dessus de sorte qu'il fonctionne comme une requête GET qui fonctionne avec imdb?
Ug, vraiment stupide faute de frappe dans le titre. Fixe maintenant... exemple classique de penser une chose et un autre type. Lorsque vous exécutez le code ci-dessus, vous n'obtenez pas une 405 réponse? EDIT: Ok, réalisé même mon code a été entaché d'irrégularités. Le ci-dessus est ce que je voulais poster, et est édité à donner l'erreur 405 ( et de sens..... )
OriginalL'auteur Serapth | 2011-03-18
Vous devez vous connecter pour publier un commentaire.
Vous devrez préciser ce que vous entendez par "léger". Qu'essayez-vous de réaliser?
Si vous pouvez ou non utiliser GET/POST/TÊTE/SUPPRIMER/etc dépendra de l'URL et ce qui est configuré dans l'application qui s'exécute sur le serveur à l'URL.
Si tout ce que vous essayez de faire est de voir si vous pouvez établir une connexion sans télécharger le contenu que vous pourriez peut-être essayer juste d'initier une connexion vers le port 80 à l'aide de sockets, mais il n'est pas vraiment fiable ou universellement pris en charge de façon juste en changeant la méthode HTTP.
Bon... le plus léger de la méthode que je pouvais penser en ce qui concerne la bande passante serait d'utiliser des sockets construire manuellement vos requêtes HTTP, obtenir assez de recul de la réponse à déterminer le code d'état HTTP, puis fermer la connexion.
Serait prendre le chemin de la main fabriqués HTTP effectivement contourner l'erreur 405 résultats? EDIT: heu, l'état des résultats, je devrais avoir dit, je suppose que techniquement HTTP 405 n'est pas vraiment une erreur. C'est seulement une poignée de sites qui sont de retour 405, et je ne sais pas quelle partie est à l'origine de cette réponse. Maintenant, je suis en supposant que sa le CHEF demande, mais je ne suis pas sûr.
Le CHEF demande ce qui serait à l'origine du problème. Ce que je veux dire par la main de l'artisanat de la requête HTTP, c'est que vous l'auriez fait avec un GET, qui est ce que le serveur pourrait s'attendre, mais depuis que vous seriez en mesure de contrôler ce que vous téléchargez, vous seriez en mesure de télécharger uniquement les en-têtes de réponse et ensuite mettre fin à la connexion avant de télécharger le corps.
OriginalL'auteur Daniel Schaffer
Ouvrir la connexion à vous-même avec une prise (au lieu d'une HttpRequest ou WebClient), et fermer le flux de données dès que vous avez lu le code d'état. Heureusement, le code d'état vient près de la partie supérieure du flux de réponse 🙂
OriginalL'auteur Rob Fonseca-Ensor
Si le CHEF retourne une 405, cela signifie que le serveur ne supporte pas la TÊTE (au moins pour que l'URL) et vous aurez tomber en arrière pour OBTENIR la place. La majorité des sites de soutien de la TÊTE, de sorte que vous voulez probablement faire la TÊTE par défaut, mais si il jette un 405, vous pourriez peut-être tomber en arrière pour OBTENIR pour ce domaine. Ou peut-être vous voulez essayer, TÊTE la première, pour chaque demande; YMMV.
Si le serveur requiert l'OBTENIR et que vous voulez réduire le trafic réseau, vous pouvez essayer de faire un sursis d'OBTENIR et/ou un GET partielle (voir, par exemple,RFC2616). Je n'ai jamais essayé de faire de ceux avec WebRequest mais je pense qu'il vous permet d'ajouter des sortants en-têtes HTTP, donc vous devriez être en mesure de le faire.
Aussi, n'oubliez pas que, si vous écrivez une araignée (qui vous êtes clairement), vous devez respecter le serveur robots.txt et c'est aussi courtois, accélérateur de vos demandes quelque chose comme une demande toutes les deux secondes, de sorte que vous n'avez pas de slashdot le serveur.
OriginalL'auteur Joe White