Маршрутизация веб-API - api / {controller} / {action} / {id} «дисфункции» api / {controller} / {id}

У меня есть маршрут по умолчанию в Global.asax:

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

Я хотел быть в состоянии предназначаться для определенной функции, поэтому я создал другой маршрут:

RouteTable.Routes.MapHttpRoute(
         name: "WithActionApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );

Итак, в моем контроллере у меня есть:

    public string Get(int id)
    {
        return "object of id id";
    }        

    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }

призвание.../api/records/bycategoryid/5 даст мне то, что я хочу. Тем не менее, призывая.../api/records/1 даст мне ошибку

Найдено несколько действий, соответствующих запросу: ...

Я понимаю, почему это так - маршруты просто определяют, какие URL действительны, но когда дело доходит до сопоставления функций, обаGet(int id) а такжеByCategoryId(int id) матчapi/{controller}/{id}, который является то, чтопутает рамки.

Что мне нужно сделать, чтобы заставить работать API-маршрут по умолчанию снова и сохранить{action}? Я думал о создании другого контроллера с именемRecordByCategoryIdController чтобы соответствовать маршруту по умолчанию API, для которого я бы запросил.../api/recordbycategoryid/5, Тем не менее, я считаю, что это «грязное» (а значит, неудовлетворительное) решение. Я искал ответы на этот вопрос, и нет учебника по использованию маршрута с{action} даже упоминает эту проблему.

Ответы на вопрос(4)

Ваш ответ на вопрос