ho il difetto percorso in Global.asax:Web API Routing - API/{Controller}/{action}/{id} "disfunzioni" api/{Controller}/{id}
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
I volevo essere in grado di indirizzare una specifica funzione, così ho creato un altro itinerario:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
quindi, a mio controllo, ho:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Calling .../api/records/bycategoryid/5
mi darà quello che voglio. Tuttavia, chiamando .../api/records/1
mi darà l'errore
Più azioni sono stati trovati che corrispondono alla richiesta: ...
capisco perché questo è - i percorsi solo definiscono quali URL sono validi, ma quando si tratta di corrispondenza delle funzioni, sia Get(int id)
sia ByCategoryId(int id)
corrispondono a api/{controller}/{id}
, che è ciò che confonde il framework.
Cosa devo fare per far funzionare di nuovo la rotta API predefinita e mantenere quella con {action}
? Ho pensato di creare un controller diverso denominato RecordByCategoryIdController
in modo che corrisponda alla route API predefinita, per la quale richiederei .../api/recordbycategoryid/5
. Tuttavia, trovo che sia una soluzione "sporca" (quindi insoddisfacente). Ho cercato delle risposte a questo e nessun tutorial sull'uso di una rotta con {action}
menziona anche questo problema.
Ho provato il consiglio sopra e tutto funziona come previsto. Grazie mille per questo "segreto". –
Sul punto 2 della tua risposta, se 'id' è opzionale, URL come'/api/{part1}/{part2} 'può ancora andare nella rotta' DefaultApi' se non viene trovata alcuna azione corrispondente per la rotta 'WithActionApi'. Per favore correggimi se sbaglio. – orad