Ho il percorso predefinito in Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Volevo essere in grado di indirizzare una funzione specifica, quindi ho creato un altro percorso:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Quindi, nel mio controller, ho:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Chiamare .../api/records/bycategoryid/5
mi darà quello che voglio. Tuttavia, la chiamata .../api/records/1
mi darà l'errore
Sono state trovate più azioni che corrispondono alla richiesta: ...
Capisco perché questo è: le rotte definiscono solo quali URL sono validi, ma quando si tratta di corrispondenza delle funzioni, sia Get(int id)
e ByCategoryId(int id)
corrispondenza api/{controller}/{id}
, che è ciò che confonde il framework.
Cosa devo fare per far funzionare nuovamente il percorso API predefinito e mantenerlo con {action}
? Ho pensato di creare un controller diverso denominato RecordByCategoryIdController
per abbinare il percorso API predefinito, per il quale avrei richiesto .../api/recordbycategoryid/5
. Tuttavia, trovo che sia una soluzione "sporca" (quindi insoddisfacente). Ho cercato risposte su questo e nessun tutorial là fuori sull'uso di un percorso {action}
menziona anche questo problema.