У мене є маршрут за замовчуванням у 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}
навіть не згадує цю проблему.