2012-06-12 128 views
74

我有上ApiController了以下行動:的ASP.NET Web API:請求的資源不支持HTTP方法「GET」

public string Something() 
{ 
    return "value"; 
} 

而且我已經配置了我的路線如下:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

在測試版,這工作得很好,但我只更新到最新的發佈候選,現在我看到的錯誤上的調用是這樣的:

釷e請求的資源不支持http方法'GET'。

爲什麼不再工作?

(我想我可以擺脫{行動},只是做一噸的控制器,但感覺凌亂。)

回答

94

如果您還沒有配置任何列舉HTTPMethod在控制你的行動,則假定RC中只有HttpPost。在測試版中,假定支持所有方法 - GET,PUT,POST和Delete。這是從測試版到RC的小改變。你可以通過[AcceptVerbs(「GET」,「POST」)]輕鬆處理多個httpmethod動作。

+0

剛剛遇到了這個,感謝修復,但好奇,爲什麼我必須用我的自定義方法做到這一點,但不是默認的「Get」方法?我有一個由控制器模板創建的Get方法,但沒有進行裝飾。這是否僅僅是因爲名字Get? – SelAromDotNet

+3

@Josh:是的!當操作方法的名稱以「Get ...」開頭時,您不必將其標記爲GET方法。在這裏閱讀更多:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api –

+0

我按照答案中的建議做了,但現在我的電話Get和Post被重定向到Get Action。請幫忙嗎? –

14

這當然是從Beta到RC的變化。在問題中提供的示例中,您現在需要使用[HttpGet]或[AcceptVerbs(「GET」)]來修飾您的操作。

如果您想將基於動詞的動作(即「GetSomething」,「PostSomething」)與基於動詞的動作混合使用,則會導致問題。如果您嘗試使用上述屬性,則會導致與控制器中任何基於動詞的動作發生衝突。一種方法可以爲每個動詞定義單獨的路線,並將默認動作設置爲動詞的名稱。這種方法可用於定義API中的子資源。例如,以下代碼支持:「/ resource/id/children」,其中id和children是可選的。

 context.Routes.MapHttpRoute(
      name: "Api_Get", 
      routeTemplate: "{controller}/{id}/{action}", 
      defaults: new { id = RouteParameter.Optional, action = "Get" }, 
      constraints: new { httpMethod = new HttpMethodConstraint("GET") } 
     ); 

     context.Routes.MapHttpRoute(
      name: "Api_Post", 
      routeTemplate: "{controller}/{id}/{action}", 
      defaults: new { id = RouteParameter.Optional, action = "Post" }, 
      constraints: new { httpMethod = new HttpMethodConstraint("POST") } 
     ); 

希望未來版本的Web API能夠更好地支持這種情況。目前在aspnetwebstack codeplex項目http://aspnetwebstack.codeplex.com/workitem/184上記錄了一個問題。如果這是您想要查看的內容,請對此問題進行投票。

51

以上所有信息都是正確的,我還想指出在System.Web.Mvc和System.Web.Http命名空間中都存在[AcceptVerbs()]批註。

如果是Web API控制器,則要使用System.Web.Http。

+0

thx @Eric,我想知道爲什麼它不會工作... – jbl

+0

@Eric。真棒,這是它不適合我的原因。我對動作有動詞,但是它通過Web.Mvc被引用,所以無法使用。 – dreza

+0

太棒了,你救了我的一天 –

25

儘管這不是對OP的回答,但我從完全不同的根本原因得到了完全相同的錯誤;所以如果這有助於其他人...

我的問題是一個錯誤命名的方法參數,導致WebAPI意外路由請求。我在我的ProgrammesController以下方法:

[HttpGet] 
public Programme GetProgrammeById(int id) 
{ 
    ... 
} 

[HttpDelete] 
public bool DeleteProgramme(int programmeId) 
{ 
    ... 
} 

DELETE請求.../API /程序/ 3並沒有獲得路由到DeleteProgramme如我所料,但GetProgrammeById,因爲DeleteProgramme沒有一個參數ID的名稱。 GetProgrammeById當然會拒絕DELETE,因爲它被標記爲只接受GET。

所以修復很簡單:

[HttpDelete] 
public bool DeleteProgramme(int id) 
{ 
    ... 
} 

,一切都很好。愚蠢的錯誤真的很難調試。

14

如果您正在使用HttpGet裝飾你的方法,添加以下using在控制器的頂部:

using System.Web.Http; 

如果使用System.Web.Mvc,則可能會出現這個問題。

+1

這是真的,並且可笑地.NET不能清楚地顯示消息。 –

2

與上面相同的問題,但根本差異很大。對我而言,我正在用https重寫規則擊中端點。在http上點擊導致錯誤,按照預期的方式使用https。

2

與OP具有相同的設置。 一個控制器與許多行動......少「凌亂」:-)

在我的情況下,我忘記了「[HttpGet]」時添加一個新的動作。

[HttpGet] 
public IEnumerable<string> TestApiCall() 
{ 
    return new string[] { "aa", "bb" }; 
} 
相關問題