Maison > développement back-end > Tutoriel C#.Net > Explication détaillée des exemples de routage d'attributs ASP.NET de l'API WEB

Explication détaillée des exemples de routage d'attributs ASP.NET de l'API WEB

Y2J
Libérer: 2017-04-25 15:49:22
original
2238 Les gens l'ont consulté

Les routes MVC suivantes sont conventionnelles

 config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
      );
Copier après la connexion

Si nous voulons obtenir un routage avec des effets similaires à ceux suivants, il est plus difficile d'utiliser un routage conventionnel.

order/Miles/三只松鼠干果/2袋
order/2017/1/13
Copier après la connexion

Ce serait plus simple si vous utilisiez le routage d'attributs.

Pour créer un nouveau projet WEB API, ouvrez le fichier WebApiConfig.cs dans le répertoire App_Start et ajoutez le code suivant pour activer la configuration du routage des attributs.

 config.MapHttpAttributeRoutes();
Copier après la connexion

Le routage par attributs peut également être mélangé avec le routage par convention, comme suit :

 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+"}
      );
    }
Copier après la connexion

Mettez une marque de fonctionnalité sur la méthode pour utiliser le routage par attribut, comme suit :

 [Route("order/{UserNickName}/{ProductName}/{count}")]
Copier après la connexion

Résultats des tests (l'URL est codée, sinon une erreur 400 sera signalée.)


Normalement, toutes les routes d'un même contrôleur commencent par Le même préfixe commençant par

  [Route("api/books")]
  [Route("api/books/{id:int}")]
  [Route("api/books")]
Copier après la connexion

est évidemment plus gênant. Nous utilisons donc l'attribut [RoutePrefix] pour définir un préfixe public

Résultat du test

Si [RoutePrefix est ​​utilisé ], pour certaines API spéciales, nous pouvons utiliser des lignes ondulées pour réécrire le préfixe de routage, comme suit :

Résultats des tests (sous la même classe)

Le préfixe de routage peut également contenir des paramètres, comme suit

Résultats des tests


Vous pouvez ajouter des contraintes de paramètres dans l'itinéraire, comme suit

Résultats des tests

Si le paramètre n'est pas de type Int, l'itinéraire ne correspondra pas

Voici quelques contraintes qui seront prises en charge

Vous pouvez utiliser plusieurs contraintes, mais utilisez des deux-points pour séparer

[Route("users/{id:int:length(1,3)}")]
public User GetUserById(int id) { ... }
Copier après la connexion

Le résultat

S'il n'est pas dans la plage, il ne correspondra pas

Les contraintes de routage personnalisées doivent implémenter l'interface IHttpRouteConstraint, veuillez consulter le site officiel pour plus de détails

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;
  }
}
Copier après la connexion

Enregistrer les contraintes

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    var constraintResolver = new DefaultInlineConstraintResolver();
    constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));

    config.MapHttpAttributeRoutes(constraintResolver);
  }
}
Copier après la connexion

Utiliser les contraintes

[Route("{id:nonzero}")]
public HttpResponseMessage GetNonZero(int id) { ... }
Copier après la connexion

Paramètres URI facultatifs et valeurs par défaut

Vous pouvez faire d'un paramètre d'itinéraire un paramètre URI facultatif en ajoutant un point d'interrogation pour le marquer. Si un paramètre de route est facultatif, vous devez définir une valeur par défaut pour le paramètre de méthode.

public class BooksController : ApiController
{
  [Route("api/books/locale/{lcid:int?}")]
  public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
}
Copier après la connexion

Ou définir la valeur par défaut dans le modèle de routage

public class BooksController : ApiController
{
  [Route("api/books/locale/{lcid=1033}")]
  public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal