Heim >Backend-Entwicklung >C#.Net-Tutorial >Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

高洛峰
高洛峰Original
2017-02-20 17:20:201229Durchsuche

Für Asp.Net Web Forms-Anwendungen entspricht die angeforderte URL einer bestimmten physischen Datei (http://xxx.com/default.aspx). Eine solche URL ist eng an die spezifische physische Datei gebunden, was viele praktische Einschränkungen mit sich bringt: Lesbarkeit, SEO-Optimierung usw. Um diese Einschränkungen zu beheben, hat Microsoft ein URL-Routing-System eingeführt. Lassen Sie uns das Asp.Net-Routing-System anhand einer Demo analysieren.

Erstellen Sie eine leere WebForm-Anwendung und fügen Sie den folgenden Code zur Datei Global.asax.cs hinzu:

public class Global : System.Web.HttpApplication
  {
    protected void Application_Start(object sender, EventArgs e)
    {
      //处理匹配的文件
      RouteTable.Routes.RouteExistingFiles = true;
      //url默认值
      RouteValueDictionary defaults = new RouteValueDictionary() { { "name", "wuwenmao" }, { "id", "001" } };
      //路由约束
      RouteValueDictionary constraints = new RouteValueDictionary() { { "name", @"\w{2,10}" }, { "id", @"\d{3}" } };
      //与路由相关的值,但不参与路由是否匹配URL模式
      RouteValueDictionary dataTokens = new RouteValueDictionary() { { "defaultName", "wuwenmao" }, { "defaultId", "001" } };
      RouteTable.Routes.MapPageRoute("default", "employees/{name}/{id}", "~/Default.aspx", false, defaults, constraints, dataTokens);
    }
  }

Erstellen Sie eine neue Datei Als WebForm-Seite von Default bezeichnet, lautet der Seitencode wie folgt:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
    <h1>这是Default.aspx页面</h1>
  <p>
  
    RouteData中Values:
    <ul>
      <% foreach (var value in RouteData.Values)
        { %>
      <li>
        <%=value.Key %>=<%=value.Value %>
      </li>
      <%} %>
    </ul>
    RouteData中DataTokens:
    <ul>
      <% foreach (var value in RouteData.DataTokens)
        { %>
      <li>
        <%=value.Key %>=<%=value.Value %>
      </li>
      <%} %>
    </ul>
  </p>
  </form>
</body>
</html>

Die Eingabepfade sind die folgenden drei und die Ergebnisse sind die gleichen:

http://localhost:2947/employees/wuwenmao/001

http://localhost:2947/employees/wuwenmao

http://localhost:2947/employees/

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Der Grund dafür ist, dass bei der Registrierung der Route Standardwerte für die Variablen in der Routing-Vorlage festgelegt werden, sodass die oben genannten drei URLs bei der Verwendung gleichwertig sind ihnen.

Rückblickend auf die globale Datei wurde bei der Registrierung der Route auch eine Variable festgelegt:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Hierbei werden reguläre Regeln verwendet, um den Wert der Variablen zu begrenzen In der Routing-Vorlage kann der entsprechende Variablenwert in der Anforderungs-URL nur dann korrekt angefordert werden, wenn er mit dem regulären Ausdruck übereinstimmt, andernfalls wird ein 404-Fehler zurückgegeben. Wenn die Länge des ID-Werts größer als 3 ist:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Das Obige hat das Asp.Net-Routing-System anhand eines einfachen Beispiels analysiert Der Quellcode. Das Implementierungsprinzip des Routing-Systems.

Wenn wir zunächst die folgende Anweisung verwenden, um eine Route in unserer globalen Datei zu registrieren, fügen wir tatsächlich eine Route zur globalen Routing-Tabelle hinzu.

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Über das Reflektor-Tool können wir Folgendes sehen:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Nach der Registrierung der Route gibt es jetzt ein Problem. Wie nutzt Asp.Net das Routing-System? Tatsächlich registriert das Asp.Net-Routingsystem ein HttpModule-Objekt, das die Anforderung abfängt, sie dann dynamisch dem HttpHandler-Objekt zuordnet, das zur Verarbeitung der aktuellen Anforderung verwendet wird, und die Anforderung schließlich über das HttpHandler-Objekt verarbeitet und darauf antwortet. Dieses HttpModule ist eigentlich UrlRoutingModule. Wenn wir das Asp.Net-Programm starten, können wir es über das Modules-Attribut in der globalen Datei überprüfen. Wie Sie im Screenshot unten sehen können, enthält das Modules-Attribut das registrierte HttpModule, das UrlRoutingModule enthält:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Welche Routing-bezogenen Vorgänge werden in diesem UrlRoutingModule ausgeführt?

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Analyse der Implementierungsprinzipien des Asp.Net-RoutingsystemsWenn wir uns den Quellcode oben ansehen, können wir sehen, dass Asp.Net die Anfrage über das registrierte UrlRoutingModule-Modul abfängt, wenn eine Anfrage eingeht, und dann die Übereinstimmung findet Wenn RouteData aus der globalen Routing-Tabelle gefunden wird, rufen Sie den entsprechenden HttpHandler gemäß HttpApplication ab und ordnen Sie ihn dann dem aktuellen Anforderungskontext zu, damit nachfolgende Pipeline-Ereignisse die aktuelle Anforderung verarbeiten können.

Schauen wir uns weiterhin den Quellcode an und analysieren, wie UrlRoutingModule RouteData aus der globalen Routing-Tabelle erhält: Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Wie Sie oben sehen können, ruft das UrlRoutingModule nacheinander die GetRouteData jeder registrierten Route auf und gibt die ersten passenden RouteData zurück registriert Keine der Routen stimmt überein und null wird zurückgegeben.

Sehen wir uns an, was GetRouteData in Route macht:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Match-Methode:

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Analyse der Implementierungsprinzipien des Asp.Net-Routingsystems

Durch den sequentiellen Aufruf der GetRouteData-Methode von Route werden die folgenden Vorgänge in der GetRouteData-Methode ausgeführt:

1 Die Match-Methode des ParsedRoute-Typs wird aufgerufen, um die URL anzufordern und registrieren Sie es in Matching der Routing-Vorlage im aktuellen Route-Objekt. Wenn keine Übereinstimmung vorliegt, wird null zurückgegeben.

2 Wenn die Anforderungs-URL mit der Routing-Vorlage des aktuellen Route-Objekts übereinstimmt RouteData-Objekt;

3. Überprüfen Sie, ob die aktuelle Anforderungs-URL den bei der Registrierung der Routing-Informationen definierten Einschränkungen entspricht. Wenn nicht, geben Sie null zurück ​und DataTokens des RouteData-Objekts; Aus Platzgründen können sie nicht einzeln analysiert werden.

Zusammenfassung:

Lassen Sie uns anhand der obigen Analyse unsere Gedanken sortieren und eine Zusammenfassung der Arbeit des Asp.Net-Routingsystems erstellen: Zuerst haben wir das Route-Objekt in Global registriert. und dann die Anforderungs-URL über das in Asp.Net registrierte HttpModule-Modul UrlRoutingModule abfangen und dann die GetRouteData des Route-Objekts aus der globalen Routing-Tabelle RouteTables.Routes aufrufen, um die Anforderungs-URL und die registrierten Routing-Informationen abzugleichen und die ersten passenden RouteData zurückzugeben , und die Suche ist abgeschlossen. Wenn es nach der gesamten RouteTables.Routes keine Übereinstimmung gibt, wird null zurückgegeben und 404 wird schließlich an die Front-End-Seite zurückgegeben.

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 der Implementierungsprinzipien des Asp.Net-Routingsystems finden Sie auf der chinesischen PHP-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