2010-07-05 2 views
28

Я хотел бы правильно поддерживать запрос HTTP HEAD, когда боты попали на мой сайт ASP.NET MVC, используя HEAD. Мне было доведено до сведения, что все запросы HTTP HEAD на сайт возвращают 404s, особенно от http://downforeveryoneorjustme.com. Это действительно раздражает. Пожелайте, чтобы они переключились на GET, как и на всех других хороших ботов.Ответ на запросы HTTP HEAD с использованием ASP.NET MVC

Если я только что изменил [AcceptVerbs(HttpVerbs.Get)] на [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)], MVC знает, что нужно отправить тело запроса?

Что вы сделали для поддержки запросов HTTP HEAD? (Образец кода будет здорово!)

+1

Структура MVC не дает никакого специального лечения для 'HEAD' бы то ни было. –

+0

@CraigStuntz - Не верно; по крайней мере, в текущих версиях ASP.NET MVC, ответы на запросы HEAD имеют только заголовки, но не тело, как ожидалось. См. Ответ a7drew ниже. –

ответ

45

Я создал простой метод действия в 2 проекта ASP.Net MVC:

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

Тогда я начал в Fiddler и выстроили HTTP GET запрос ударить этого URL:

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

Ожидаемое полное содержание страницы был возвращен.

Затем я изменил запрос на использование HTTP ГОЛОВУ вместо HTTP GET. Я получил только ожидаемую информацию о головке и информацию об отсутствии в исходном файле.

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 

Я предполагаю, что вы в том числе ограничение на способ действия таким образом, что он будет отвечать только на HTTP GET глаголы. Если вы сделаете что-то подобное, оно будет работать как для GET, так и HEAD, или вы можете полностью опустить ограничение, если оно не дает значения.

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

Спасибо за это, отличный ответ. Я выполнил ваш пример и заменил все экземпляры [HttpGet] на [AcceptVerbs (new [] {"GET", "HEAD"})] прямо на моем сайте. Теперь твиттер и другие похожие боты могут вызывать HEAD на любом из моего контента и получать правильный ответ, а не ошибки, которые я их бросал. Cheers – Aaron

+1

Просто голова и не делайте ошибку, которую я сделал, пытаясь разместить глаголы Get и Head для отдельных действий, так как он будет вызывать 500 запросов Head. –

+3

Вы также можете использовать [HttpGet, HttpHead], который немного легче набирать. – user169771

20

Вы можете получить результат, просто делая следующее

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)] 
public ActionResult TestMe() =>View(); 
Смежные вопросы