2016-07-19 9 views
0

Lassen Sie uns zum Beispiel sagen, dass ich 2 Controller mit den entsprechenden AttributenWie kann ich widersprüchliche Routen in ASP.NET MVC erkennen?

[Route("a/b")] 

und

[Route("a/{str}")] 

Dann gibt es einen Konflikt, wenn die Anforderung "a/b" URL gemacht wird. Gibt es eine Möglichkeit, einen Komponententest zu schreiben, der nach solchen Konflikten sucht?

+1

Versuchen Sie etwas wie [Testen von Routen in ASP.NET MVC] (http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx/) –

Antwort

1

Es gibt keine "widersprüchliche" Route. In Routing, the first match wins, und der Rest wird ignoriert.

Wenn Sie die Attribute Route verwenden, müssen Sie sich dieses Verhaltens besonders bewusst sein, da .NET attributes don't guarantee any order. Wenn Sie ähnliche Routen wie diese haben, sollten Sie daher das Attribut Order property des Attributs verwenden, um sicherzustellen, dass die spezifischste Route zuerst ausgeführt wird. Die Bestellung wird von der niedrigsten zur höchsten Nummer verarbeitet.

[Route("a/b", Order = 1)] 
[Route("a/{str}", Order = 2)] 

Natürlich, das kommt nur ins Spiel, wenn die Strecken sind ähnlich zueinander und Sie haben einen mit einem Platzhalter. Aber Sie sollten immer sich bewusst sein, wenn Sie eine Route mit einem Platzhalter hinzufügen, dass es könnte vor keine ähnlichen Strecken ohne Platzhalter eingetragen werden (noch schlimmer, das Verhalten konnte Wechsel von einer Kompilierung der Anwendung der nächste), so dass Sie müssen die Reihenfolge bei der Verwendung von Platzhaltern.

Da die Reihenfolge der Routen erheblich ist, ist es recht einfach, eine Route an der falschen Stelle hinzuzufügen, die andere Routen außer Betrieb setzt. Sie sollten route unit testing nicht nur einrichten, um sicherzustellen, dass das Routing funktioniert, sondern auch um sicherzustellen, dass Ihre Routen weiterhin funktionieren, wenn Sie mehr hinzufügen. Dies gibt Ihnen die "Erkennung", die Sie suchen, aber wie ich bereits erwähnt, können Sie false positive mit diesem Ansatz, da die Reihenfolge Ihrer Attribute von einem Kompilieren zum nächsten ohne die Order Eigenschaft an Ort und Stelle ändern können .

Der sicherste Weg ist, wachsam zu sein über die Verwendung der Order Eigenschaft, wenn Sie Platzhalter haben.

Zusätzliche Information:

HINWEIS: Convention-based Routing ändert sich nicht, um von einem der Kompilierung auf die nächste der Weg Attribut Routing tut. Wenn Sie die Reihenfolge Ihrer Routen genau steuern möchten, verwenden Sie stattdessen Convention-based Routing.