Detaillierte Erläuterung der ASP.NET-Attribut-Routing-Beispiele der WEB-API

Y2J
Freigeben: 2017-04-25 15:49:22
Original
2195 Leute haben es durchsucht

Das Folgende sind herkömmliche MVC-Routen

 config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
      );
Nach dem Login kopieren

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
Nach dem Login kopieren

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();
Nach dem Login kopieren

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+"}
      );
    }
Nach dem Login kopieren

Setzen Sie eine Funktionsmarkierung auf die Methode, um Attributrouting zu verwenden, wie folgt:

 [Route("order/{UserNickName}/{ProductName}/{count}")]
Nach dem Login kopieren

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")]
Nach dem Login kopieren

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) { ... }
Nach dem Login kopieren

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;
  }
}
Nach dem Login kopieren

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);
  }
}
Nach dem Login kopieren

Einschränkungen verwenden

[Route("{id:nonzero}")]
public HttpResponseMessage GetNonZero(int id) { ... }
Nach dem Login kopieren

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) { ... }
}
Nach dem Login kopieren

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) { ... }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!