Mam domyślną trasę w Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Chciałem mieć możliwość kierowania na określoną funkcję, więc stworzyłem inną trasę:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Tak więc w moim kontrolerze mam:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Dzwonienie .../api/records/bycategoryid/5
da mi to, czego chcę. Jednak dzwonienie .../api/records/1
da mi błąd
Znaleziono wiele działań pasujących do żądania: ...
Rozumiem, dlaczego tak jest - trasy po prostu definiują, które adresy URL są prawidłowe, ale jeśli chodzi o dopasowywanie funkcji, zarówno, jak Get(int id)
i ByCategoryId(int id)
dopasuj api/{controller}/{id}
, co myli strukturę.
Co muszę zrobić, aby domyślna trasa interfejsu API znów działała i zachować tę z {action}
? Pomyślałem o stworzeniu innego kontrolera o nazwie RecordByCategoryIdController
pasującej do domyślnej trasy API, o którą chciałbym poprosić .../api/recordbycategoryid/5
. Uważam jednak, że jest to „brudne” (a więc niezadowalające) rozwiązanie. Szukałem odpowiedzi na ten temat i nie ma tam samouczka na temat korzystania z trasy, {action}
nawet jeśli wspomina o tym problemie.