English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Analyse du système de routage de l'API Web Asp.Net---Méthode de déploiement deWebHost

在上篇文章中我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是如何实现的。我们还是从一个简单的实例开始。

创建一个空的WebApi项目,在Global中注册路由信息:

  public class WebApiApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      //注册路由
      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
        name: "default",
        routeTemplate: "api"/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional });
    }
  }

Créer un Controller nommé Home :

  public class HomeController : ApiController
  {
    // GET: api/Home
    public IEnumerable<string> Get()
    {
      return new string[] { "value1", "value2" };
    }
    // GET: api/Home/5
    public string Get(int id)
    {
      return "value";
    }
  }

Lancez et exécutez, saisissez respectivement http: dans la barre d'adresse du navigateur.//localhost:46351/api/home et http://localhost:46351/api/home/5Résultat suivant :

 

Après une brève inspection de l'exemple d'instance d'Asp.Net Web API, nous allons commencer à analyser le système de routes d'Asp.Net Web API.

Pour commencer, regardons la manière d'enregistrer les routes dans Asp.Net Web API, comme suit :

 

Dans ce processus d'enregistrement des routes, quels opérations sont cachées ? Voici notre code source :

 

En regardant le code source, on peut voir que l'enregistrement des routes dans Asp.Net Web API est effectivement réalisé par l'appel à l'extension method MapHttpRoute du type HttpRouteCollection. Dans la méthode MapHttpRoute, nous voyons que l'objet de route créé est enregistré en appelant la méthode Add de l'objet HttpRouteCollection. En raison de la propriété statique de GlobalConfiguration configurée par Configuration de type HostedHttpRouteCollection avec RouteTable.Routes comme paramètre de construction, et parce que le type HostedHttpRouteCollection est une sous-classe du type HttpRouteCollection, dans le type HostedHttpRouteCollection, la sous-classe HostedHttpRouteCollection redéfinit les méthodes Add et CreateRoute de la classe parente, comme indiqué dans le graphique suivant, donc, en réalité, le type de l'objet de route créé est HostedHttpRoute. Cet objet de route est placé dans le tableau des routes globales et conservé. À partir de là, nous pouvons savoir que le type de l'objet de route conservé dans le tableau des routes globales est HostedHttpRoute. Alors, à quoi sert de placer l'objet de route enregistré dans le tableau des routes globales ? Analyse ultérieure.

 

Comme on peut le voir dans le code source ci-dessus, le dernier objet de route créé est de type HostedHttpRoute. Alors, maintenant, une question se pose : lors de l'enregistrement de la route précédemment, nous n'avons pas spécifié le RouteHandler et le HttpHandler, d'où viennent-ils ajoutés à l'objet de route ? Quels sont les secrets cachés dans le processus de création de l'objet HostedHttpRoute ? Nous continuerons à examiner le code source ci-dessous :

 

Selon l'analyse ci-dessus, jusqu'à présent, nous pouvons savoir que lorsque Asp.Net Web API est hébergé par WebHost, les objets de route enregistrés sont des instances de type HostedHttpRoute, stockées dans le tableau de routes global RouteTable.Routes, et les RouteHandler et HttpHandler utilisés pour traiter les requêtes sont des instances de type HttpControllerRouteHandler et HttpControllerHandler respectivement.

 Après l'enregistrement des informations de route, comment Asp.Net Web API utilise-t-il les informations de route enregistrées pour la routage ? Est-ce aussi réalisé par un HttpModule comme dans Asp.Net ? Regardons les propriétés Modules de la classe Global :

 

Comme on peut le voir clairement sur l'écran ci-dessus, lorsque le service Asp.Net Web API est hébergé par WebHost, il utilise également, comme Asp.Net, UrlRoutingModule pour la routage. Comme nous l'avons vu dans l'article précédent sur l'analyse du système de routage Asp.Net, Asp.Net intercepte les requêtes par UrlRoutingModule, puis matche successivement dans le tableau de routes global pour obtenir le RouteData correspondant à l'URL de la requête pour le traitement ultérieur. Dans Asp.Net Web API, comme nous l'avons vu dans l'article précédent, les objets de route stockés dans le tableau de routes global sont de type HostedHttpRoute. Continuons notre analyse pour voir comment Asp.Net Web API obtient finalement le RouteData correspondant.

Dans UrlRoutingModule, RouteData est obtenu en appelant successivement la méthode GetRouteData de chaque objet de route. Dans Asp.Net Web API, étant donné que le type de l'objet de route est HostedHttpRoute, regardons ce qui se passe lors de l'appel à la méthode GetRouteData :

 

On peut voir que dans HostedHttpRoute, RouteData est obtenu par la méthode GetRouteData de l'attribut OriginalRoute, à partir de l'analyse précédente, nous savons que cet attribut OriginalRoute est de type HttpWebRoute :

 

 À partir de l'analyse ci-dessus, on peut voir que lorsque Asp.Net Web API est déployé de manière WebHost, il finit toujours par utiliser le système de routage Asp.Net pour effectuer le travail de matching. Cependant, il est nécessaire de noter que, en raison de la surcharge de la méthode de validation de contraintes du type parent HttpWebRoute dans HttpWebRoute, Asp.Net Web API utilise toujours son propre mode pour vérifier si les contraintes sont compatibles :

Enfin, après une série de travaux, on a obtenu l'objet RouteData et les RouteHandler, HttpHandler contenus à l'intérieur, Asp.Net Web API peut traiter les requêtes et les réponses via ceux-ci.

 Résumé :

À partir de l'analyse ci-dessus, on peut conclure : Lorsque Asp.Net Web API est déployé de manière WebHost, les routes enregistrées sont stockées dans le tableau de routes global ; lors de l'obtention de RouteData, le matching des routes est effectué par les règles de matching du système de routage Asp.Net, mais il réalise également ses propres règles de validation de contraintes.

Voici la totalité du contenu de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutenerez également le tutoriel Néon.

Déclaration : Le contenu de cet article est extrait du réseau, propriété des auteurs respectifs, le contenu est apporté par les utilisateurs d'Internet de manière volontaire et téléversé, le site Web ne détient pas de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, le site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer