在 MVC 控制器方法中添加对 [HttpHead] 和 [HttpGet] 的支持

Add support for [HttpHead] and [HttpGet] in MVC controller method

我有一个支持 [HttpGet] 属性的 MVC 方法。

[HttpGet]        
[ActionName("Index")]
public ActionResult IndexGet(string l)
{               
    return View();
}

但是,我注意到在我们的网络服务器日志文件中我们收到了一个 HEAD 请求,但是由于我没有定义 [HttpHead] 我们正在 returning 404,这是正确的。 Web 服务器日志文件条目例如

2020-05-20 00:00:51 W3SVC1 EC2AMAZ 10.0.0.206 HEAD / 443 - XXX.XXX.XXX.XXX HTTP/1.1 Mozilla/5.0+(compatible;+UptimeRobot/2.0;+http://www.uptimerobot.com/) - www.domainname.com 404 0 0 306 694 155

2020-05-20 00:01:13 W3SVC1 EC2AMAZ 10.0.0.206 GET / 443 - XXX.XXX.XXX.XXX HTTP/1.1 Mozilla/5.0+(compatible;+UptimeRobot/2.0;+http://www.uptimerobot.com/) - www.domainname.com 200 0 0 156847 674 1065

如何添加对 [HttpHead] 的支持以及我应该在响应中 return 什么。我尝试同时添加 [HttpHead][HttpGet]

[HttpHead]  
[HttpGet]       
[ActionName("Index")]
public ActionResult IndexGet(string l)
{               
    return View();
}

但在浏览器中得到以下内容

The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

并且它破坏了 [HttpGet] 方法。如果我删除 [HttpHead] 并刷新 URL,[HttpGet] 加载正常。

HEAD 请求应该只响应 headers,而不是内容。因此不应与 GET 混合使用。

最简单的选择是在控制器中创建一个额外的方法来处理 HEAD 请求:

[HttpHead]
[ActionName("Index")]
public ActionResult IsAlive()
{
   return Ok();
}

HttpGetHttpHead 属性表示用于限制操作方法的属性,以便该方法处理 HTTP GET 请求或 HTTP HEAD 请求。一个请求不能同时是这两个,所以将它们结合起来会导致控制器方法永远不匹配,结果是 404 响应。

允许对单个控制器方法同时进行 GET 和 HEAD 请求的正确方法是使用:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]
    

查看

的已接受答案