【问题标题】:The web API controller action name can not be determined by the type of the requestWeb API 控制器操作名称不能由请求的类型确定
【发布时间】:2014-02-27 02:52:38
【问题描述】:

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

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

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

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

我应该将第二个 Get 命名为:Open(int id) 吗?

【问题讨论】:

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


    【解决方案1】:

    做一个 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}

    【讨论】:

    • “通常对于给定的用户,您有一个学年列表”但是我的 SchoolyearBrowseResponse 类中有一个 List。这有意义吗?或者我没听懂你……
    • 是的,这很有道理。
    • 再次感谢达林,我喜欢你的回答,它真的很有帮助:)
    • 嗯......我仍然想到一件事。为什么我不能将 GetSchoolyears 放回 SchoolyearController 中,因为它现在有了唯一的名称?
    • 好的,看看资源路径:/shoolyears/{id} 已经被占用,所以我不能制作 SchoolyearController.GetSchoolyears => /schoolyears/{userId} 我必须做到:/schoolyears/ user/{id} 现在是唯一的。但这样的资源路径设计好吗?
    【解决方案2】:

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

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

    【讨论】:

    • 我的 SchoolyearBrowseResponse 类中有一个 List。你的方法名称对我来说没有意义。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2013-07-01
    • 2013-06-23
    • 2013-09-10
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多