2013-02-06 33 views
3

我有點困惑。我有一個控制器(從ApiController派生),它具有以下方法:Web.API和FromBody

[ActionName("getusername")] 
public string GetUserName(string name) 
{ 
    return "TestUser"; 
} 

我的路由設置是這樣的:

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

我一直得到一個400錯誤,當我試着打/api/mycontroller/getusername/test與小提琴手的GET。

我發現當我將[FromBody]添加到GetUserName中的name參數時,所有工作都正常。

我在某種程度上認爲[FromBody]用於HttpPost,表示該參數在帖子主體中,因此GET不需要。看起來我雖然錯了。

這是如何工作的?

+1

你嘗試將'name'重命名爲'id'嗎?您的路由需要一個名爲'id'的參數映射到。 –

+0

此外,是否添加'[FromBody]'實際上將'name'參數設置爲值'test'? –

回答

6

您需要更改您的路由:

config.Routes.MapHttpRoute(
    name: "ActionApi", 
    routeTemplate: "api/{controller}/{action}/{name}", 
    defaults: new { name = RouteParameter.Optional } 
); 

或更改參數的名稱:

[ActionName("getusername")] 
public string GetUserName(string id) 
{ 
    return "TestUser"; 
} 

注:其它路由參數必須方法的參數名稱相匹配。

+0

這是做到了。我沒有意識到參數名稱必須匹配路由...認爲它只是一個佔位符。 – Nicros

1

你也可以做到以下幾點,如果它是更接近你想要的功能:

// GET api/user?name=test 
public string Get(string name) 
{ 
    return "TestUser"; 
} 

這裏假設你使用的是ApiController命名UserController並允許您將name參數傳遞作爲查詢字符串。這樣,您不必指定ActionMethod,而是依賴於HTTP動詞和匹配路由。

+0

我認爲這是要走的路 - 沒有路線的變化,參數可以任意命名...... – Nicros

+0

@Nicros我只是在考慮同樣的問題,並得出了相同的結論。當這種事情發生時,我們都有一個公平的機會。 –