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