Маршрутизация веб-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}
даже упоминает эту проблему.