Im vorherigen Artikel haben wir das Asp.Net-Routing-System analysiert. Heute werden wir kurz analysieren, wie das Routing-System der Asp.Net-Web-API intern implementiert wird, wenn die Asp.Net-Web-API im WebHost-Modus bereitgestellt wird. Beginnen wir mit einem einfachen Beispiel.
Erstellen Sie ein leeres WebApi-Projekt und registrieren Sie Routing-Informationen in 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 }); } }
Erstellen Sie ein Projekt mit dem Namen Home Controller:
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"; } }
Starten Sie die Ausführung und geben Sie http://localhost:46351/api/home und http://localhost:46351/ in die Adressleiste des Browsers ein. api/home/5, die Ergebnisse sind wie folgt:
Ein kurzer Blick auf Asp.Net Web API-Beispiele: Beginnen wir mit der Analyse des Routingsystems der Asp.Net-Web-API.
Schauen wir uns zunächst an, wie Routen in der Asp.Net-Web-API registriert werden, wie folgt:
Welche Vorgänge sind in dieser Routenregistrierung verborgen? Verfahren? ? Unten ist unser Quellcode:
Durchsuchen Im Quellcode ist ersichtlich, dass die Registrierung von Routen in der Asp.Net-Web-API tatsächlich durch Aufrufen der Erweiterungsmethode MapHttpRoute vom Typ HttpRouteCollection implementiert wird. In der MapHttpRoute-Methode sehen wir, dass das erstellte Routenobjekt durch Aufrufen von gespeichert wird Methode des HttpRouteCollection-Objekts hinzufügen. Und weil die statischen Eigenschaften von GlobalConfiguration durch den HostedHttpRouteCollection-Typ mit RouteTable.Routes als Konstruktionsparameter durch Configuration erstellt werden und weil der HostedHttpRouteCollection-Typ eine Unterklasse des HttpRouteCollection-Typs ist, überschreibt die Unterklasse HostedHttpRouteCollection im HostedHttpRouteCollection-Typ die Add-Methode und Die Methode „CreateRoute“ ist wie folgt: Der Typ des tatsächlich erstellten Routing-Objekts ist „HostedHttpRoute“. Hier können wir erkennen, dass der Typ des Routing-Objekts gespeichert ist in der globalen Routing-Tabelle ist HostedHttpRoute . Welchen Nutzen hat es also, registrierte Routing-Objekte in der globalen Routing-Tabelle zu speichern? Dies wird im folgenden Teil analysiert.
Wie Sie dem obigen Quellcode entnehmen können, ist das zuletzt erstellte Routingobjekt vom Typ HostedHttpRoute, sodass jetzt ein Problem vorliegt , wir haben es zuvor registriert. Beim Routing werden RouteHandler und HttpHandler nicht angegeben. Wo werden sie dem Routing-Objekt hinzugefügt? Was sind die verborgenen Geheimnisse beim Erstellen von HostedHttpRoute-Objekten? Sehen wir uns weiterhin den Quellcode an:
Durch die obige Analyse können wir bisher wissen, dass das registrierte Routing-Objekt eine Instanz des Typs HostedHttpRoute ist, wenn die Asp.Net-Web-API im WebHost-Modus gehostet wird und in der globalen Routing-Tabelle RouteTable.Routes gespeichert wird. und Verwenden von RouteHandler und HttpHandler, die zur Verarbeitung von Anforderungen verwendet werden, sind Instanzen des Typs HttpControllerRouteHandler bzw. Instanzen des Typs HttpControllerHandler.
Wie verwende ich nach der Registrierung der Routing-Informationen die registrierten Routing-Informationen für das Routing in der Asp.Net-Web-API? Wird es über ein HttpModule wie in Asp.Net implementiert? Starten wir das Programm und schauen uns das Modules-Attribut in der Global-Klasse an:
Es ist deutlich zu sehen Aus dem Screenshot oben ist ersichtlich, dass beim Hosten von Diensten durch die Asp.Net-Web-API im WebHost-Modus das Routing wie bei ASP.Net über UrlRoutingModule implementiert wird. Aus der vorherigen Analyse des Asp.Net-Routingsystems können wir wissen, dass Asp.Net die Anforderung über das UrlRoutingModule abfängt und sie dann nacheinander aus der globalen Routing-Tabelle abgleicht, um die RouteData zu erhalten, die der Anforderungs-URL für die spätere Verarbeitung entsprechen . In der Asp.Net-Web-API wissen wir aus dem oben Gesagten, dass das in der globalen Routing-Tabelle gespeicherte Routing-Objekt vom Typ HostedHttpRoute ist. Lassen Sie uns weiter analysieren, wie wir schließlich die passenden RouteData in der Asp.Net-Web-API erhalten.
In UrlRoutingModule werden RouteData erhalten, indem die GetRouteData-Methode jedes Routing-Objekts nacheinander aufgerufen wird. Da in der Asp.Net-Web-API der Typ des Routing-Objekts HostedHttpRoute ist, schauen wir uns an, was passiert, wenn die GetRouteData-Methode aufgerufen wird:
Wie Sie sehen können, in HostedHttpRoute RouteData wird über die GetRouteData-Methode der Eigenschaft OriginalRoute abgerufen. Aus der vorherigen Analyse wissen wir, dass diese OriginalRoute-Eigenschaft vom Typ HttpWebRoute ist:
Aus der obigen Analyse können wir ersehen, dass bei der Bereitstellung der Asp.Net-Web-API im WebHost-Modus die Matching-Arbeit letztendlich über das Routing-System von Asp.Net abgeschlossen wird. Es ist jedoch zu beachten, dass die Asp.Net-Web-API weiterhin eine eigene Methode verwendet, um zu überprüfen, ob die Einschränkungen übereinstimmen, da die Methode zum Überprüfen von Einschränkungen des übergeordneten Typs in HttpWebRoute neu geschrieben wurde:
Nachdem die Asp.Net-Web-API das RouteData-Objekt und die darin enthaltenen RouteHandler und HttpHandler durch eine Reihe von Arbeiten erhalten hat, kann sie diese zum Verarbeiten der Anfrage verwenden und antworten.
Zusammenfassung:
Aus der obigen Analyse kann geschlossen werden, dass die registrierte Route im globalen Speicher gespeichert wird, wenn die Asp.Net-Web-API im WebHost-Modus bereitgestellt wird Route in der Tabelle; beim Abrufen von RouteData wird der Routenabgleich über die Abgleichsregeln des Asp.Net-Routingsystems durchgeführt, es werden jedoch eigene Regeln zur Einschränkungsüberprüfung implementiert.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.
Weitere Artikel zur Analyse des Asp.Net Web API-Routingsystems --- WebHost-Bereitstellungsmethode finden Sie auf der chinesischen PHP-Website!