2010-07-05 13 views
28

Desidero supportare correttamente la richiesta HEAD HTTP quando i bot colpiscono il mio sito ASP.NET MVC utilizzando HEAD. È stato portato alla mia attenzione che tutte le richieste HEAD HTTP al sito restituivano 404, in particolare da http://downforeveryoneorjustme.com. Il che è davvero fastidioso Vorrei che passassero a GET come tutti gli altri buoni robot là fuori.Risposta a richieste HEAD HTTP utilizzando ASP.NET MVC

Se cambio solo [AcceptVerbs(HttpVerbs.Get)] a [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)] MVC saprà di eliminare il corpo della richiesta?

Cosa avete fatto per supportare le richieste HTTP HEAD? (Esempio di codice sarebbe grande!)

+1

Il framework MVC dà alcun trattamento speciale a 'HEAD' sorta. –

+0

@CraigStuntz - Non vero; almeno nelle versioni correnti di ASP.NET MVC, le risposte alle richieste HEAD hanno solo le intestazioni ma nessun corpo, come previsto. Vedere la risposta di a7drew sotto. –

risposta

45

ho creato un metodo semplice azione in un progetto di 2 ASP.Net MVC:

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

Poi ho lanciato Fiddler e costruito un HTTP GET richiesta per colpire questo URL:

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

Il contenuto pagina intera previsto è stato restituito.

Poi, ho cambiato la richiesta di utilizzare una testa HTTP invece di un HTTP GET. Ho ricevuto solo le informazioni sulla testa attese e nessuna informazione sul corpo nell'output grezzo.

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 

La mia ipotesi è che si sta includendo un vincolo sul metodo di azione in modo tale che essa risponderà solo alle HTTP GET verbi. Se fai qualcosa di simile, funzionerà sia per GET e HEAD, oppure puoi omettere il vincolo interamente se non fornisce alcun valore.

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

Grazie per questo, ottima risposta. Ho seguito il tuo esempio e ho sostituito tutte le istanze di [HttpGet] con [AcceptVerbs (new [] {"GET", "HEAD"})] nel mio sito. Ora Twitter e altri robot simili possono chiamare un TESTO su uno qualsiasi dei miei contenuti e ricevere la risposta corretta, piuttosto che gli errori che stavo lanciando loro .. Saluti – Aaron

+1

Solo un testa a testa e non fare l'errore che ho fatto cercando di piazzare i verbi Get e Head su azioni separate poichè genererà un 500 sulla richiesta Head. –

+3

Puoi anche usare [HttpGet, HttpHead] che è un po 'più facile da scrivere. – user169771

20

È possibile ottenere il risultato semplicemente facendo seguito

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