Отвечайте на запросы HTTP HEAD с помощью ASP.NET MVC

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

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

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


person DavGarcia    schedule 05.07.2010    source источник
comment
Платформа MVC вообще не обрабатывает HEAD.   -  person Craig Stuntz    schedule 06.07.2010
comment
@CraigStuntz - Неправда; по крайней мере, в текущих версиях ASP.NET MVC ответы на запросы HEAD, как и ожидалось, содержат только заголовки, но не тело. См. Ответ a7drew ниже.   -  person Jon Schneider    schedule 17.08.2017


Ответы (2)


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

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

Затем я запустил Fiddler и создал запрос HTTP GET, чтобы попасть по этому URL:

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

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

Затем я изменил запрос на использование HTTP HEAD вместо 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();
    }
}
person a7drew    schedule 07.07.2010
comment
Спасибо за это, отличный ответ. Я последовал вашему примеру и заменил все экземпляры [HttpGet] на [AcceptVerbs (new [] {GET, HEAD})] прямо на моем сайте. Теперь твиттер и другие подобные боты могут вызывать HEAD для любого моего контента и получать правильный ответ, а не ошибки, которые я им выдавал. Ура - person Aaron; 09.03.2011
comment
Просто сделайте хедз-ап и не совершайте ошибку, которую я сделал, пытаясь поместить глаголы Get и Head в отдельные действия, так как это приведет к выдаче 500 по запросу Head. - person cs-NET; 02.09.2016
comment
Вы также можете использовать [HttpGet, HttpHead], который немного легче набирать. - person user169771; 31.10.2016
comment
Использование [HttpGet, HttpHead] НЕ сработало для меня (в .NET 4.5.1) - они вызвали запросы с использованием GET или HEAD для возврата 404, тогда как другие предоставленные решения работали нормально. - person Jon Schneider; 17.08.2017
comment
Я использую [AcceptVerbs (HttpVerbs.Get | HttpVerbs.Head)], который устраняет любые потенциальные проблемы с использованием магических строк. (См. Также ответ пользователя2101889.) - person ChrisFox; 04.03.2019

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

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]
public ActionResult TestMe() =>View();
person user2101889    schedule 23.02.2013