0

我正在尝试使以下三种途径起作用:

  • GET /api/category- 列出所有类别
  • GET /api/category/1- 获取有关类别 1 的详细信息
  • GET /api/category/1/questions- 从类别 1 中获取问题

我无法让此路由正常工作。

MyCategoryController有以下三个方法定义:

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

我怎样才能让这些匹配而不相互冲突?我们在项目的其他部分使用了 AttributeRouting。

4

2 回答 2

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 框架——它将是基于消息的,并且将对这些消息进行路由。

于 2013-10-08T09:03:01.950 回答
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)
    );
于 2013-10-08T08:59:33.010 回答