0

我想獲得以下三條路線的工作:三條路線中的Web API一個動詞

  • GET /api/category - 列出所有類別
  • GET /api/category/1 - 獲得約1類細節
  • GET /api/category/1/questions - 獲得來自第1類的問題

我無法使此路由工作。

CategoryController有以下三種方法定義:

public IEnumerable<Category> Get() {} 
public Category Get(int id) {} 
public IEnumerable<QuestionSummary> GetQuestions(int id) {} 

我怎樣才能得到這些匹配,而不是海誓山盟衝突?我們在項目的其他部分使用了AttributeRouting。

回答

3

下面應該工作:

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "SubResource", 
     routeTemplate: "api/{controller}/{categoryId}/{action}" 
    ); 

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

和控制器:

public class CategoryController : ApiController 
{ 
    public IEnumerable<Category> Get() 
    { 
     ... 
    } 

    public Category Get(int id) 
    { 
     ... 
    } 

    [HttpGet] 
    public IEnumerable<QuestionSummary> Questions(int categoryId) 
    { 
     ... 
    } 
} 

的ASP.NET Web API 2,使這種情況更加容易,因爲它允許attribute based routing

我相信微軟最終會把它做對(ServiceStack這樣做)。希望在ASP.NET Web API 3中,他們將引入基於消息的路由,他們將以正確的方式完成一個REST框架 - 它將基於消息並且路由將在這些消息上完成。

+0

你在技術上是正確的,但我不能讓它工作,直到我使用不同路線中的'id'字段的不同名稱。非常不直觀,但嘿,它的作品! :) –

1

我不認爲你可以在同一個控制器上有同一個動詞的多種方法,除非你使用「動作」。

我想你可以使用3個不同的控制器來處理你的3條路線,只要你按照正確的順序註冊。

config.Routes.MapHttpRoute(
    name: "Route1", 
    routeTemplate: "/api/category/{id}/questions", 
    controllerType: typeof(YourController1) 
    ); 

config.Routes.MapHttpRoute(
    name: "Route2", 
    routeTemplate: "/api/category/{id}", 
    controllerType: typeof(YourController2) 
    ); 

config.Routes.MapHttpRoute(
    name: "Route3", 
    routeTemplate: "/api/category", 
    controllerType: typeof(YourController3) 
    ); 
+0

在這種情況下你會如何使用「動作」?如何在使用上述定義時禁用此控制器的現有路線? –

+0

使用操作必須修改路由模板。例如:/ api/category - >/api/category/list其中list是動作。如果您已經提供了您的api,我明白並不可行;我剛剛提到可以在同一個控制器上爲同一個動詞處理多個方法。 – Crixo