使用ASP.NET MVC响应HTTP HEAD请求

时间:2010-07-05 18:29:59

标签: asp.net-mvc acceptverbs http-head

当机器人使用HEAD攻击我的ASP.NET MVC站点时,我想正确支持HTTP HEAD请求。我注意到,对网站的所有HTTP HEAD请求都返回404,特别是来自http://downforeveryoneorjustme.com。哪个真烦人。希望他们像其他所有好机器人一样切换到GET。

如果我只是将[AcceptVerbs(HttpVerbs.Get)]更改为[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)],MVC会知道放弃请求的正文吗?

您为支持HTTP HEAD请求做了什么? (代码示例会很棒!)

2 个答案:

答案 0 :(得分:53)

我在ASP.Net MVC 2项目中创建了一个简单的操作方法:

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

然后我启动了Fiddler并构建了一个 HTTP GET 请求来点击此网址:

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();
    }
}

答案 1 :(得分:26)

您只需执行以下操作即可获得结果

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