2013-07-18 87 views
3

我創建以下控制器:多個GET操作

public FoosController : ApiController 
{ 
    public IQueryable Get() 
    { 
     return AnODataQueryableListOfFoos(); 
    } 

    public void Delete(Guid id) 
    { 
     DeleteTheFooWithId(id); 
    } 

    public IQueryable<Bar> GetBars(Guid id) 
    { 
     var foo = GetFooById(id); 
     return AnODataQueryableListOfBarsForThisFoo(foo); 
    } 

    public IEnumerable ProjectedBars(Guid id) 
    { 
     var foo = GetFooById(id); 
     return foo.Qux 
      ? OneProjectionOfBars(foo) 
      : AnotherProjectionOfBars(foo); 
    } 
} 

(酒吧的列表,可以看作是富的「內容」 ...)

這是我打算請使用以下網址:

GET /api/Foos       -> Get 
GET /api/Foos/SOME_GUID/Bars   -> GetBars 
GET /api/Foos/SOME_GUID/ProjectedBars -> GetProjectedBars 
DELETE /api/Foos/SOME_GUID   -> Delete 

我試着與一對夫婦的[ActionName]和自定義路線的組合,但總有兩種衝突或404

讓這項工作最簡單的方法是什麼?如果可能的話,我想保留我的路由通用(即沒有控制器特定的東西)。其他控制器使用更標準的方法。

我也開放給有人指出我完全濫用網址。改進歡迎。

+2

你有沒有考慮屬性的路由?作爲內置支持的最新webapi。你可以在這裏閱讀更多關於它的信息:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 –

+0

@KiranChalla I'我想過了。主要問題:尚不穩定。我也傾向於喜歡基於約定的實現。而且我願意讓我的設計適應標準慣例或稍微調整慣例。 –

回答

2

我同意,屬性路由將是最好的一段路要走,但是你可以嘗試以下方法:

public FoosController : ApiController 
{ 
    [HttpGet] 
    public IQueryable Get() 
    { 
     return AnODataQueryableListOfFoos(); 
    } 

    [HttpGet] 
    [ActionName("Bars")] 
    public IQueryable<Bar> GetBars(Guid id) 
    { 
     var foo = GetFooById(id); 
     return AnODataQueryableListOfBarsForThisFoo(foo); 
    } 

    [HttpGet] 
    [ActionName("ProjectedBars")] 
    public IEnumerable GetProjectedBars(Guid id) 
    { 
     var foo = GetFooById(id); 
     return foo.Qux 
      ? OneProjectionOfBars(foo) 
      : AnotherProjectionOfBars(foo); 
    } 
} 

,然後使用以下途徑:

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

config.Routes.MapHttpRoute(
    name: "DefaultApi2", 
    routeTemplate: "api/{controller}/{id}/{action}" 
    ); 
0

您要求的是n深度子資源,唯一真正的解決方案是Web API的v2中提供的屬性路由。直到它被釋放(我相信會很快),你可以使用RPC喜歡的方式:

routes.MapHttpRoute("RPC", "rpc/{controller}/{id}/{action}"); 

您需要註冊的第一個HTTP航線,並使用比「API」等前綴所以它不會與實際的api /路線衝突。