2016-09-20 3 views
2

ich zwei Controller haben wie folgt:Ungewöhnliche [RoutePrefix] Verhalten in ASP.NET WebAPI

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) 
    { 
    } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) 
    { 
    } 
} 

nun von oben Blick auf den Code, würde ich denken, dass die folgenden zwei Routen erstellt werden:

  • v1/user/etwas/{id}
  • v1/user/{id}

Aber leider aus irgendeinem Grund, dass es keine Das ist der Fall. Ich erhalte die folgende Ausnahmemeldung bei dem Versuch, eine der oben genannten Strecken zuzugreifen:

Multiple Controller-Typen wurden gefunden, die mit der URL übereinstimmen. Dies kann passieren, wenn Attributrouten auf mehreren Controllern mit der angeforderten URL übereinstimmen. Die Anforderung folgende Anpasssteller Typen gefunden: MyProject.Api.Controllers.UserController, MyProject.Api.Controllers.SomethingsController

Bitte helfen Sie mir in herauszufinden, was ich vielleicht falsch, oder die am kleinen Detail tun I hier fehlt.

+0

Im Falle des Attribut-Routing versucht die Web API alle Controller zu finden, die einer Anfrage entsprechen. Wenn es sieht, dass mehrere Controller in der Lage sind, damit umzugehen, dann löst es eine Ausnahme aus –

+0

@Div Ich weiß, dass das Problem ist, dass wenn Sie sich den obigen Code ansehen, mehrere Controller nicht in der Lage sein sollten, da RoutePrefix zu behandeln sind anders. – haseebahmed7

+0

@ haseebahmed7 obwohl ihr Routenpräfix unterschiedlich ist, stimmen ihre aufgelösten Routen überein.zum Beispiel 'v1/user/{id}' mit der Übereinstimmung 'v1/user/sound/{id}', wobei id parameter arg in der ersten Route 'something/{id}' braucht. Routenpräfix und Routenattribute werden kombiniert, um eine vollständige Route zu erstellen, die zur Routentabelle hinzugefügt wird. – Nkosi

Antwort

3

Obwohl ihr Routenpräfix unterschiedlich ist, stimmen ihre aufgelösten Routen überein. zum Beispiel v1/user/{id} entspricht v1/user/something/{id} wo id Parameter arg in der ersten Route wird something/{id} nehmen.

Routenpräfix und Routenattribute werden kombiniert, um eine vollständige Route zu erstellen, die zur Routentabelle hinzugefügt wird.

In einem solchen Fall müssen Sie Einschränkungen verwenden, um die Routen besser zu unterscheiden.

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) { ... } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) { ... } 
} 

So, jetzt mit dem int Einschränkung something gewohnt für gültige Parameter für die UserController.GetByIdAsync Aktion

Referenz Attribute Routing in ASP.NET Web API 2: Route Constraints

Strecke Constraints verwechselt werden

Routen Einschränkungen können Sie beschränken, wie die Parameter in der Route Vorlage sind abgestimmt. Die allgemeine Syntax lautet "{parameter: constraint}". Zum Beispiel:

[Route("users/{id:int}"] 
public User GetUserById(int id) { ... } 

[Route("users/{name}"] 
public User GetUserByName(string name) { ... } 

Hier wird die erste Strecke nur, wenn das „ID“ Segment des eine ganze Zahl ist URI ausgewählt werden. Andernfalls wird die zweite Route ausgewählt.