2013-10-10 45 views
0

如何根據參數名稱使用單個路由調用不同的動作。具有不同參數名稱的單個路由上的多個GET謂詞Web Api

我需要以下

/api/v1/user 
GET 
key=dfddg&secret=fafassaf&query=select id from user where user like '%ggg%' 

/api/v1/user 
GET 
key=dfddg&secret=fafassaf&ids=fadfdafdsf,faffasfasfsf,asfasfasfasfas,asfasfasfasf 

我已經寫了下面的代碼

[RoutePrefix("api/v1/user")] 
public class UserController : ApiController 
{ 
    [GET("")] 
    public String GetAllUsers(String key, String secret, String query) 
    { 
     return "GetAllUsers"; 
    } 

    [GET("")] 
    public String GetLookupUserIds(String key, String secret, String ids) 
    { 
     return "GetLookupUserIds"; 
    } 

但第一種情況下工作正常,但第二個引發異常

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:14823/api/v1/user?key=rhdgsdgdsr&secret=fhdgdgdfhdfh&ids=fdfdf,dfadfff'.", 
    "MessageDetail": "No action was found on the controller 'User' that matches the request." 
} 

回答

1

我認爲這裏的問題是api/v1/user的請求與路由表中的第一條路由相匹配(注意:路由匹配首先發生在不考慮查詢參數然後進行動作匹配的情況下)現在,路由表中的第一條路由可能是基於哪個屬性路由將操作添加到路由表的反射順序。 (你可以查看路由表GlobalConfiguration.Configuration.Routes條目的樣子)。

屬性路由通過分配action變量來添加路由變量的動作名稱的值。 Web API的動作選擇具有邏輯,如果它看到action變量已分配,它將嘗試在具有相同名稱的動作列表(像您的動作重載場景)中尋找最佳匹配動作。

你可以嘗試以下方法:

  1. 相同的動作名稱兩種以上方法使用ActionName 屬性。

  2. 如果1.沒有意義,那麼您可能會有不同的行爲模板。

+0

它的工作非常感謝你。 –

相關問題