如何将不同的操作映射到具有相同签名的Web API方法

时间:2016-09-15 08:27:24

标签: rest asp.net-web-api asp.net-mvc-routing

我正在尝试使用Web Api最佳实践创建REST服务,我遇到了一个我不知道如何处理的情况。

想象一下,我有群组,每个群组内都有用户。

这就是我的GroupController的样子:

[RoutePrefix("api/v1/groups")]
public class GroupsController : ApiController
{
    [HttpGet]
    [Route("{id:int}")]
    public IHttpActionResult Get(int id)
    {
        return Ok();
    }

    // I also want to add endpoint which fetches all the users inside of group and I'd like to do it like this:
    [HttpGet]
    [Route("{id:int}/users")]
    public IHttpActionResult Get(int id)
    {
        return Ok();
    }
}

正如您所看到的,我的第二个方法将无法编译,因为我们在同一个类中不能有两个具有相同签名的方法。

我的路线模板看起来像是标准模板:

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

我知道我可以添加一个映射动作方法名称的路线,但我想知道是否有更好的方法来实现我的目标。我想坚持编写RESTful服务的最佳原则。据我所知,其中一个建议是避免使用自定义操作名称,因为这对于WCF服务来说更常见。

1 个答案:

答案 0 :(得分:3)

不要混合If cell.Interior.ColorIndex = 6 Then If cell.Value = "" Then cell.Value = ActiveCell.Value Exit For End If End If 样式路由配置和基于属性的路由。使用其中一个更简单(我更喜欢基于属性,因为它是明确的,并允许更清晰的类方法名称。)

您似乎也没有调用在配置上启用基于属性的路由所需的方法 - MapHttpRoute()

最后,我按照以下方式重命名您的方法,以确保方法签名中没有冲突:config.MapHttpAttributeRoutes()GetGroups(int id)