У меня есть маршрут по умолчанию в 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}
даже не упоминает эту проблему.