Seltsames Verhalten beim Attributrouting in ApiController
-
22-12-2019 - |
Frage
Ich verwende Attributrouting, um meine Routen in einem Controller anzugeben, der von System.Web.Http.ApiController erbt.Ich bemerke seltsames Verhalten.Hier ist ein Beispielcode:
[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;
}
}
Das funktioniert genau so, wie ich es erwarten würde.Wenn ich ~/api/1/user/someId besuche, erhalte ich die erwarteten Informationen zurück.Wenn ich dazu wechsle, die „1“ nicht in das Routenpräfix aufzunehmen, erhalte ich die Meldung „Es wurde keine HTTP-Ressource gefunden, die mit dem Anforderungs-URI ‚baseUrl/api/user/someId‘ übereinstimmt.“
Ich habe MVC-Routen, Web-API-Routen und Attributrouten, die alle beim App-Start in diesem Projekt registriert sind, aber ich denke, dass die Standardrouten für diesen Controller ~/userrest/... wären.Daher würde ich nicht glauben, dass die Registrierung die Ursache dafür wäre, aber ich könnte mich irren.
Beispiel für das, was ich möchte:
[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;
}
}
Ich gehe davon aus, dass ~/api/user/someId funktionieren würde, erhalte jedoch die oben erwähnte Fehlermeldung („Es wurde keine HTTP-Ressource gefunden, die mit dem Anforderungs-URI ‚baseUrl/api/user/someId‘ übereinstimmt.“).
Vollständige Fehler-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>
Lösung
Basierend auf Ihrer Fehlerbeschreibung scheinen Sie konventionelle Routen registriert zu haben, bevor Sie MapHttpAttributeRoutes aufrufen.Beispielsweise könnten Sie eine Route haben wie config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
.In diesem Fall gefällt die Anfrage api/user/someid
würde mit dieser Route übereinstimmen und die Web-API würde nach einem Controller vom Typ suchen UserController
.Rufen Sie unbedingt an MapHttpAttributeRoutes
vor dieser konventionellen Route.
Grundregel:Spezifischere Routen sollten vor weniger spezifischen oder generischen Routen registriert werden.