2010-07-05 3 views
28

Je souhaite correctement prendre en charge la requête HTTP HEAD lorsque les robots touchent mon site ASP.NET MVC à l'aide de HEAD. Il a été porté à mon attention que toutes les requêtes HTTP HEAD vers le site renvoyaient des 404, en particulier de http://downforeveryoneorjustme.com. Ce qui est vraiment ennuyeux. J'aimerais qu'ils passent à GET comme tous les autres bons bots là-bas.Répondre aux demandes HTTP HEAD à l'aide de ASP.NET MVC

Si je change simplement [AcceptVerbs(HttpVerbs.Get)] en [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)], MVC sait-il que le corps de la requête sera supprimé?

Qu'avez-vous fait pour prendre en charge les requêtes HTTP HEAD? (Exemple de code serait génial!)

+1

Le framework MVC donne aucun traitement spécial 'HEAD' que ce soit. –

+0

@CraigStuntz - Pas vrai; Au moins dans les versions actuelles d'ASP.NET MVC, les réponses aux requêtes HEAD ont juste les en-têtes mais pas de corps, comme prévu. Voir la réponse d'a7drew ci-dessous. –

Répondre

45

J'ai créé une méthode d'action simple dans un projet ASP.Net MVC 2:

public class HomeController : Controller 
{ 
    public ActionResult TestMe() 
    { 
     return View(); 
    } 
} 

Je lancé Fiddler et construit un HTTP GET demande de frapper cette URL:

http://localhost.:51149/Home/TestMe

Le contenu de la page complète attendue a été retourné.

Puis, je l'ai changé la demande d'utiliser un HTTP HEAD au lieu d'un HTTP GET. Je n'ai reçu que les informations de tête attendues et aucune information sur le corps dans la sortie brute.

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Wed, 07 Jul 2010 16:58:55 GMT 
X-AspNet-Version: 4.0.30319 
X-AspNetMvc-Version: 2.0 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Content-Length: 1120 
Connection: Close 

Je pense que vous incluez une contrainte sur la méthode d'action telle qu'elle ne répondra à HTTP GET verbes. Si vous faites quelque chose comme ceci, cela fonctionnera pour GET et HEAD, ou vous pouvez omettre complètement la contrainte si elle ne fournit aucune valeur.

public class HomeController : Controller 
{ 
    [AcceptVerbs(new[] {"GET", "HEAD"})] 
    public ActionResult TestMe() 
    { 
     return View(); 
    } 
} 
+1

Merci pour cela, bonne réponse. J'ai suivi votre exemple et remplacé toutes les instances de [HttpGet] par [AcceptVerbs (new [] {"GET", "HEAD"})] juste à travers mon site. Maintenant, twitter et autres robots similaires peuvent appeler un chef sur n'importe lequel de mon contenu et recevoir la réponse correcte, plutôt que les erreurs que je les jetais .. Cheers – Aaron

+1

Juste un heads-up et ne faites pas l'erreur que j'ai fait en essayant de placer les verbes Get et Head sur des actions séparées car il lancera un 500 sur la requête Head. –

+3

Vous pouvez également utiliser [HttpGet, HttpHead], ce qui est un peu plus facile à taper. – user169771

20

Vous pouvez obtenir le résultat suivant en faisant simplement

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)] 
public ActionResult TestMe() =>View(); 
Questions connexes