Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der ASP.NET-Attribut-Routing-Beispiele der WEB-API

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

Y2J
Y2JOriginal
2017-04-25 15:49:222213Durchsuche

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!

Stellungnahme:
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