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

41
我希望在 ASP.NET MVC 网站受到爬虫 HTTP HEAD 请求时能正确支持它们。有人向我指出网站所有的 HTTP HEAD 请求都返回 404 错误,特别是来自于 http://downforeveryoneorjustme.com 的请求,这真的很恼人。希望他们能像其他好的机器人一样切换到 GET 请求。
如果我只是将 [AcceptVerbs(HttpVerbs.Get)] 更改为 [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)],MVC 是否会知道删除请求正文?
您已经采取了哪些措施来支持 HTTP HEAD 请求?(代码示例将很好!)

1
MVC框架对HEAD没有任何特殊处理。 - Craig Stuntz
@CraigStuntz -- 这不是真的;至少在当前版本的ASP.NET MVC中,对HEAD请求的响应只包含头部而没有正文,这是预期的。请参见下面a7drew的答案。 - Jon Schneider
2个回答

58

我在一个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请求。如果你这样做了,它将可以同时适用于GETHEAD请求,或者你也可以完全不加约束条件,如果没有必要的话。

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

1
谢谢你的回答,非常好。我按照你的示例,将我的网站中所有的[HttpGet]替换为[AcceptVerbs(new[] {"GET", "HEAD"})]。现在Twitter和其他类似的机器人可以调用我的任何内容的HEAD,并收到正确的响应,而不是我之前抛出的错误。干杯! - Aaron
1
提醒一下,不要像我一样尝试将Get和Head动词放在不同的操作上,因为这会导致Head请求返回500错误。 - cs-NET
3
你也可以使用[HttpGet, HttpHead],这样打起来会更简单一些。 - user169771
4
在.NET 4.5.1上,使用[HttpGet,HttpHead]对我没有起作用-- 它们导致使用GET或HEAD请求返回404错误 -- 而其他提供的解决方案可以正常工作。 - Jon Schneider
2
我使用[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)],这可以消除使用魔术字符串可能出现的任何问题。(另请参见user2101889的答案。) - ChrisFox

30
您可以通过以下简单步骤实现该结果。
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]
public ActionResult TestMe() =>View();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接