Roteamento da API da Web - api / {controller} / {action} / {id} "disfunctions" api / {controller} / {id}

Eu tenho a rota padrão no Global.asax:

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

Eu queria ser capaz de direcionar uma função específica, então criei outra rota:

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

Então, no meu controlador, eu tenho:

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

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

Chamando.../api/records/bycategoryid/5 vai me dar o que eu quero. No entanto, chamando.../api/records/1 vai me dar o erro

Várias ações foram encontradas que correspondem à solicitação: ...

Eu entendo porque isso é - as rotas apenas definem quais URLs são válidas, mas quando se trata de correspondência de função, ambasGet(int id) eByCategoryId(int id) partidaapi/{controller}/{id}que é o queconfunde o quadro.

O que preciso fazer para que a rota da API padrão funcione novamente e manter a rota com{action}? Eu pensei em criar um controlador diferente chamadoRecordByCategoryIdController para corresponder à rota da API padrão, para a qual gostaria de solicitar.../api/recordbycategoryid/5. No entanto, acho que isso é uma solução "suja" (assim, insatisfatória). Eu procurei respostas sobre isso e nenhum tutorial sobre como usar uma rota com{action} até menciona esta questão.

questionAnswers(4)

yourAnswerToTheQuestion