2010-07-05 166 views
28

我想在機器人使用HEAD打我的ASP.NET MVC站點時正確支持HTTP HEAD請求。它引起了我的注意,所有對網站的HTTP HEAD請求都返回404,特別是從http://downforeveryoneorjustme.com。這真的很煩人。希望他們能夠像所有其他優秀的機器人一樣切換到GET狀態。使用ASP.NET MVC響應HTTP HEAD請求

如果我只是將[AcceptVerbs(HttpVerbs.Get)]更改爲[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]將MVC知道要刪除請求的正文?

你做了什麼來支持HTTP HEAD請求? (代碼示例將是巨大的!)

+1

MVC框架沒有給出特殊處理'HEAD'取得任何結果。 – 2010-07-06 13:03:28

+0

@CraigStuntz - 不正確;至少在當前版本的ASP.NET MVC中,對HEAD請求的響應只有頭部但沒有正文,正如預期的那樣。請參閱下面的a7drew的答案。 – 2017-08-17 15:05:41

回答

45

我在ASP.Net MVC 2項目中創建一個簡單的動作方法:

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

然後我發起小提琴手,並建立了一個HTTP GET請求打這個網址:返回

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響應動詞約束。如果你這樣做,它可以同時適用於GETHEAD,或者你可以完全忽略約束條件,如果它沒有提供任何值。

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

謝謝你,很好的答案。我遵循你的例子,並在我的網站中用[AcceptVerbs(new [] {「GET」,「HEAD」})]右鍵替換了[HttpGet]的所有實例。現在,Twitter和其他類似的機器人可以在我的任何內容中調用HEAD,並收到正確的回覆,而不是我扔給他們的錯誤。乾杯 – Aaron 2011-03-09 02:40:20

+1

只要站起來,不要犯我嘗試放置的錯誤Get和Head對單獨的動作動詞,因爲它會在Head請求中拋出500。 – 2016-09-02 14:29:29

+3

你也可以使用[HttpGet,HttpHead],它更容易輸入。 – user169771 2016-10-31 16:15:10

20

您可以通過簡單地做以下

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