Attribut de Routage Comportement Étrange ApiController
-
22-12-2019 - |
Question
Je suis l'aide de l'attribut de routage pour spécifier mes itinéraires dans un contrôleur qui hérite de System.Web.Http.ApiController.Je suis certains funky comportement.Voici un exemple de code:
[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;
}
}
Qui fonctionne absolument comment je m'attends.Lorsque je visite ~/api/1/utilisateur/someId-je obtenir de l'information attendue en arrière.Quand je switch de ne pas inclure le " 1 " dans le préfixe de l'itinéraire-je obtenir "Aucune ressource HTTP a été trouvée, qui correspond à l'URI de la demande "baseUrl/api/utilisateur/someId'."
J'ai mvc routes, l'api web de routes et d'attribut routes tous être enregistrés sur l'app début dans ce projet mais je pense que les routes par défaut pour ce contrôleur est ~/userrest/...donc je ne pense pas que l'enregistrement de ceux qui seraient la cause de cela, mais je peux me tromper.
Exemple de ce que je veux:
[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;
}
}
Je m'attends que ~/api/utilisateur/someId serait de travailler mais j'ai l'erreur mentionnée ci-dessus ("Pas de HTTP ressource a été trouvée, qui correspond à l'URI de la demande "baseUrl/api/utilisateur/someId'.").
Plein d'erreur 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>
La solution
Basé sur votre description de l'erreur, vous semblez avoir enregistré les voies traditionnelles avant d'appeler MapHttpAttributeRoutes.Par exemple, vous pourriez avoir une route comme config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
.Dans ce cas, la requête comme api/user/someid
serait correspond à cette route et à l'API de Web serait à la recherche d'un contrôleur de type UserController
.Assurez-vous d'appeler MapHttpAttributeRoutes
avant de ce classique de l'itinéraire.
Règle de base:plus d'itinéraires spécifiques doivent être enregistrés avant les moins spécifiques ou génériques routes.