Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung der ASP.NET-Attribut-Routing-Beispiele der WEB-API
Das Folgende sind herkömmliche MVC-Routen
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, );
Wenn wir Routing mit ähnlichen Effekten wie den folgenden erreichen möchten, ist die Verwendung herkömmlicher Konventionsroutings schwieriger.
order/Miles/三只松鼠干果/2袋 order/2017/1/13
Es wäre einfacher, wenn Sie Attributrouting verwenden würden.
Um ein neues WEB-API-Projekt zu erstellen, öffnen Sie die Datei WebApiConfig.cs im App_Start-Verzeichnis und fügen Sie den folgenden Code hinzu, um die Konfiguration des Attributroutings zu aktivieren.
config.MapHttpAttributeRoutes();
Attributrouting kann auch wie folgt mit Konventionsrouting gemischt werden:
public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id=@"\d+"} ); }
Setzen Sie eine Funktionsmarkierung auf die Methode, um Attributrouting zu verwenden, wie folgt:
[Route("order/{UserNickName}/{ProductName}/{count}")]
Testergebnisse (die URL ist codiert, andernfalls wird ein 400-Fehler gemeldet.)
Normalerweise beginnen alle Routen im selben Controller mit Das gleiche Präfix, das mit
[Route("api/books")] [Route("api/books/{id:int}")] [Route("api/books")]
beginnt, ist offensichtlich problematischer. Daher verwenden wir das Attribut [RoutePrefix], um ein öffentliches Präfix festzulegen.
Testergebnis
Wenn [RoutePrefix ist used ], für einige spezielle APIs können wir Wellenlinien verwenden, um das Routing-Präfix wie folgt umzuschreiben:
Testergebnisse (unter derselben Klasse)
Das Routing-Präfix kann auch Parameter wie folgt enthalten
Testergebnisse
Sie können der Route wie folgt Parameterbeschränkungen hinzufügen
Testergebnisse
Wenn Der Parameter ist nicht vom Typ Int, die Route wird nicht abgeglichen
Im Folgenden sind einige Einschränkungen aufgeführt, die unterstützt werden
Sie können mehrere verwenden Einschränkungen, aber Verwenden Sie Doppelpunkte zum Trennen
[Route("users/{id:int:length(1,3)}")] public User GetUserById(int id) { ... }
Das Ergebnis
Wenn es nicht innerhalb des Bereichs liegt, stimmt es nicht überein
Benutzerdefinierte Routing-Einschränkungen müssen zur Implementierung der IHttpRouteConstraint-Schnittstelle verwendet werden. Einzelheiten finden Sie auf der offiziellen Website.
public class NonZeroConstraint : IHttpRouteConstraint { public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { object value; if (values.TryGetValue(parameterName, out value) && value != null) { long longValue; if (value is long) { longValue = (long)value; return longValue != 0; } string valueString = Convert.ToString(value, CultureInfo.InvariantCulture); if (Int64.TryParse(valueString, NumberStyles.Integer, CultureInfo.InvariantCulture, out longValue)) { return longValue != 0; } } return false; } }
Einschränkungen registrieren
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint)); config.MapHttpAttributeRoutes(constraintResolver); } }
Einschränkungen verwenden
[Route("{id:nonzero}")] public HttpResponseMessage GetNonZero(int id) { ... }
Optionale URI-Parameter und Standardwerte
Sie können einen Routenparameter zu einem optionalen URI-Parameter machen, indem Sie ihn mit einem Fragezeichen markieren. Wenn ein Routenparameter optional ist, müssen Sie einen Standardwert für den Methodenparameter definieren.
public class BooksController : ApiController { [Route("api/books/locale/{lcid:int?}")] public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... } }
Oder definieren Sie den Standardwert in der Routing-Vorlage
public class BooksController : ApiController { [Route("api/books/locale/{lcid=1033}")] public IEnumerable<Book> GetBooksByLocale(int lcid) { ... } }
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der ASP.NET-Attribut-Routing-Beispiele der WEB-API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!