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>
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top