Web API控制器操作名称无法由请求的类型确定

时间:2013-12-21 21:35:12

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

做一个REST样式的API我想知道我如何处理重复的动作名称:

public SchoolyearBrowseResponse Get(int userId)
{
    return _service.GetSchoolyears(userId);
}

public SchoolyearOpenResponse Get(int id)
{
    return _service.OpenSchoolyear(id);
}

据说动作的名称应该是请求类型。现在我有两个带有int参数的Get方法,这在C#中是不可能的。

我应该命名第二个获取:Open(int id)吗?

2 个答案:

答案 0 :(得分:3)

  

做一个REST样式的API我想知道我如何处理重复的动作名称

在RESTful样式的API中,您永远不必处理此类重复项。在RESTful样式的API中,您正在处理资源。

因此,在您的特定情况下,您有2个资源:

  • 用户
  • 一个学年

所以你会有以下路线:

  • /users/{userId}/schoolyears - >这对应于你的第一个动作
  • /shoolyears/{id} - >这对应于你的第二个动作

所以:

public class UsersController : ApiController
{
    public SchoolyearBrowseResponse GetSchoolYears(int userId)
    {
        return _service.GetSchoolyears(userId);
    }
}

public class SchoolYearsController : ApiController
{
    public SchoolyearOpenResponse Get(int id)
    {
        return _service.OpenSchoolyear(id);
    }
}

最后一步是您的路线:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "UserSchoolYears",
        routeTemplate: "api/{controller}/{userId}/schoolyears",
        defaults: new { controller = "Users", action = "GetSchoolYears" }
    );

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

作为旁注,我想提一下,用户(你的SchoolyearBrowseResponse)课程的学年很难理解。通常对于给定的用户,您有一个学年的列表。如果您想为用户获得特定的学年,您可以使用/users/{userId}/schoolyears/{schoolyearid}

答案 1 :(得分:2)

典型的解决方案是按以下顺序命名:)

_service.OpenSchoolyearByYear(id);
_service.OpenSchoolyearByUserId(id);