2010-07-05 33 views
28

Me gustaría apoyar correctamente la solicitud HEAD HTTP cuando los bots golpean mi sitio ASP.NET MVC usando HEAD. Me llamó la atención que todas las solicitudes HTTP HEAD al sitio devolvieran 404, particularmente desde http://downforeveryoneorjustme.com. Lo cual es realmente molesto Ojalá cambiaran a GET como todos los otros buenos bots que hay.Responder a las solicitudes HTTP HEAD utilizando ASP.NET MVC

Si acabo de cambiar [AcceptVerbs(HttpVerbs.Get)] a [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)] ¿sabrá MVC dejar el cuerpo de la solicitud?

¿Qué ha hecho para soportar las solicitudes HTTP HEAD? (Ejemplo de código sería genial!)

+1

El marco MVC da ningún tratamiento especial para 'HEAD' en absoluto. –

+0

@CraigStuntz - No es cierto; al menos en las versiones actuales de ASP.NET MVC, las respuestas a las solicitudes HEAD solo tienen los encabezados pero no el cuerpo, como se esperaba. Ver la respuesta de a7drew a continuación. –

Respuesta

45

creé un método simple acción en un proyecto de ASP.Net MVC 2:

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

Entonces lanzaron violinista y construido una HTTP GET solicitud para golpear este URL: fue devuelto

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

El contenido de la página completa esperado.

Entonces, he cambiado la solicitud de utilización de una cabeza HTTP en lugar de un HTTP GET. Recibí solo la información de la cabeza esperada y ninguna información del cuerpo en la salida sin procesar.

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 

Mi suposición es que va a incluir una restricción sobre el método de acción de tal manera que sólo responderá a HTTP GET verbos. Si hace algo como esto, funcionará para GET y HEAD, o puede omitir la restricción por completo si no proporciona ningún valor.

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

Gracias por esto, gran respuesta. Seguí tu ejemplo y reemplacé todas las instancias de [HttpGet] con [AcceptVerbs (nuevo [] {"GET", "HEAD"})] en todo mi sitio. Ahora Twitter y otros bots similares pueden llamar a HEAD en cualquiera de mis contenidos y recibir la respuesta correcta, en lugar de los errores que les estaba lanzando. Saludos – Aaron

+1

Solo un aviso y no cometas el error que cometí al tratar de ubicarlo los verbos Get and Head en acciones separadas ya que arrojarán 500 en la solicitud Head. –

+3

También puede usar [HttpGet, HttpHead] que es un poco más fácil de escribir. – user169771

20

Puede conseguir el resultado simplemente haciendo siguiente

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