Attributo instradamento strano comportamento in Apicontroller
-
22-12-2019 - |
Domanda
Sto usando il routing degli attributi per specificare i miei percorsi in un controller che eredita da sistema.web.http.apicontroller. Sto ricevendo un comportamento funky. Ecco alcuni campioni:
[RoutePrefix("api/1/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
.
funziona assolutamente come mi aspetterei. Quando visito ~ / API / 1 / Utente / Someid ottengo indietro le informazioni previste. Quando passerò per non includere il '1' nel prefisso del percorso ottenuto "Nessuna risorsa HTTP è stata trovata che corrisponde alla richiesta URI 'Baseurl / API / Utente / Someid'."
Ho rotte MVC, rotte API Web e percorsi di attributo sono tutti registrati su APP START in questo progetto, ma penserei che i percorsi predefiniti per questo controller sarebbero ~ / USERREST / ... quindi non penserei di registrarti Quelle sarebbero la causa di questo, ma potrei sbagliare.
Campione di ciò che voglio:
[RoutePrefix("api/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
.
Aspetterei che ~ / API / Utente / Someid funzionino tuttavia, ottengo l'errore sopra menzionato ("Non è stata trovata alcuna risorsa HTTP che corrisponde all'URIS BASEURL / API / USER / Someid '."). < / P >.
Errore completo XML:
<Error>
<Message>
No HTTP resource was found that matches the request URI
'baseUrl/api/user/someId';.
</Message>
<MessageDetail>
No type was found that matches the controller named 'user'.
</MessageDetail>
</Error>
. Soluzione
In base alla descrizione dell'errore, sembra che tu abbia registrato percorsi convenzionali registrati prima di chiamare MaftatTtatTratTratTratTtatTtatTPATTtribAd esempio, potresti avere un percorso come config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
.In questo caso la richiesta come api/user/someid
corrisponderebbe a questa rotta e l'API Web sarebbe cerca un controller di tipo UserController
.Assicurati di chiamare MapHttpAttributeRoutes
prima di questo percorso convenzionale.
regola di base : i percorsi più specifici devono essere registrati prima dei percorsi meno specifici o generici.