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

Rest 如何将不同的操作映射到具有相同签名的Web API方法,rest,asp.net-web-api,asp.net-mvc-routing,Rest,Asp.net Web Api,Asp.net Mvc Routing,我正在尝试使用WebAPI最佳实践创建REST服务,但遇到了一个我不知道如何处理的情况 假设我有组,每个组中都有用户 这就是我的GroupController的外观: [RoutePrefix("api/v1/groups")] public class GroupsController : ApiController { [HttpGet] [Route("{id:int}")] public IHttpActionResult Get(int id) {

我正在尝试使用WebAPI最佳实践创建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服务中更常见。

不要将
maphttroute()
样式路由配置和基于属性的路由混合使用。使用其中一个更简单(我更喜欢基于属性的,因为它是显式的,并且允许更清晰的类方法名称)

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


最后,我将按如下方式重命名您的方法,以确保方法签名中没有冲突:
GetGroups(int-id)
GetUsersForGroup(int-id)

那么,我是否能够通过导航到api/v1/groups/1/usersforgroup来点击“GetUsersForGroup(int-id)”,属性的路径为
api/v1/groups/1/users
。这也是为什么我更喜欢属性路由,因为路由不依赖于方法名。这就是我将您的响应标记为答案的原因。我猜这是因为URL与控制器上的某个路由匹配,即使在本例中是部分匹配。据我所知,如果您使用自定义操作名称调用“GET”端点,它会映射“GET”后面的短语,在我的示例中,它映射用户。