So erstellen Sie Routenbeschränkungen in ASP.NET Core

Routenbeschränkungen in ASP.NET Core werden verwendet, um unerwünschte Daten herauszufiltern oder daran zu hindern, Ihre Controller-Aktionen zu erreichen. Eine Einführung in das Routing in ASP.NET Core finden Sie in meinem vorherigen Artikel zum Attribut-basierten Routing im Vergleich zum konventionellen Routing in ASP.NET Core. Dieser Artikel geht über die Grundlagen hinaus und erläutert die erweiterten Vorgänge anhand von Routenbeschränkungen.

Um mit den in diesem Artikel bereitgestellten Codebeispielen arbeiten zu können, muss Visual Studio 2019 auf Ihrem System installiert sein. Wenn Sie noch keine Kopie haben, können Sie Visual Studio 2019 hier herunterladen. 

Erstellen Sie ein ASP.NET Core MVC-Projekt in Visual Studio 2019

Lassen Sie uns zunächst ein ASP.Net Core-Projekt in Visual Studio 2019 erstellen. Angenommen, Visual Studio 2019 ist auf Ihrem System installiert, führen Sie die folgenden Schritte aus, um ein neues ASP.Net Core-Projekt in Visual Studio zu erstellen.

  1. Starten Sie die Visual Studio-IDE.
  2. Klicken Sie auf "Neues Projekt erstellen".
  3. Wählen Sie im Fenster "Neues Projekt erstellen" aus der Liste der angezeigten Vorlagen "ASP.NET Core-Webanwendung" aus.
  4. Weiter klicken.
  5. Geben Sie im Fenster "Konfigurieren Sie Ihr neues Projekt" den Namen und den Speicherort für das neue Projekt an.
  6. Aktivieren Sie optional das Kontrollkästchen "Lösung und Projekt im selben Verzeichnis platzieren", abhängig von Ihren Einstellungen.
  7. Klicken Sie auf Erstellen.
  8. Wählen Sie im nächsten Fenster "Neue ASP.NET Core-Webanwendung erstellen" .NET Core als Laufzeit und ASP.NET Core 3.1 (oder höher) aus der Dropdown-Liste oben aus.
  9. Wählen Sie als Projektvorlage „Webanwendung (Model-View-Controller)“ aus, um eine neue ASP.NET Core MVC-Anwendung zu erstellen. 
  10. Stellen Sie sicher, dass die Kontrollkästchen "Docker-Unterstützung aktivieren" und "Für HTTPS konfigurieren" deaktiviert sind, da diese Funktionen hier nicht verwendet werden.
  11. Stellen Sie sicher, dass die Authentifizierung auf "Keine Authentifizierung" eingestellt ist, da wir auch keine Authentifizierung verwenden.
  12. Klicken Sie auf Erstellen.

Wenn Sie diese Schritte ausführen, wird in Visual Studio 2019 ein neues ASP.NET Core MVC-Projekt erstellt. In den folgenden Abschnitten wird dieses Projekt verwendet, um zu veranschaulichen, wie Routenbeschränkungen in ASP.NET Core 3.1 verwendet werden können.

Die RouteCollection-Klasse in ASP.NET Core

Die RouteTable-Klasse in ASP.NET Core enthält eine Eigenschaft namens Routes, in der alle Routen als RouteCollection gespeichert sind. Die RouteCollection-Klasse enthält einige Erweiterungsmethoden, mit denen Routen zugeordnet oder ignoriert werden können.

MapRoute ist eine überladene Methode, die Einschränkungen als Parameter akzeptiert. Sie können dies verwenden, um Ihre Einschränkung an die Route zu übergeben. Das Folgende ist die Deklaration der MapRoute-Methode.

öffentliche statische Route MapRoute (diese RouteCollection-Routen, Zeichenfolgenname,

    String-URL, Objektstandards, Objektbeschränkungen);

Die IRouteConstraint-Schnittstelle in ASP.NET Core

Die IRouteConstraint-Schnittstelle ist ein Vertrag, der nur die Deklaration einer Methode namens Match enthält. Diese Schnittstelle muss um eine Klasse und die darin implementierte Match-Methode erweitert werden, um zu überprüfen, ob ein bestimmter URL-Parameter für eine Einschränkung gültig ist. So wird die IRouteConstraint-Schnittstelle definiert:

Namespace Microsoft.AspNetCore.Routing

{

    öffentliche Schnittstelle IRouteConstraint

    {

        bool Match (

            HttpContext httpContext,

            IRouter Route,

            string routeKey,

            RouteValueDictionary-Werte,

            RouteDirection routeDirection);

    }}

}}

Das ConstraintMap-Wörterbuch in ASP.NET Core

Eine ConstraintMap ist ein Wörterbuch, das eine Liste von Routenbeschränkungen enthält, die die Routenbeschränkungsschlüssel den IRouteConstraint-Implementierungen zuordnen. Das unten angegebene Code-Snippet zeigt, wie Sie Ihrem Wörterbuch Ihre benutzerdefinierten Einschränkungen hinzufügen können.

public void ConfigureServices (IServiceCollection-Dienste) 

{  

  services.Configure (routeOptions =>  

  { 

     routeOptions.ConstraintMap.Add ("emailconstraint", typeof (EmailRouteContraint)); 

  }); 

}} 

Implementieren Sie die IRouteConstraint Match-Methode in ASP.NET Core

Um eine benutzerdefinierte Routenbeschränkung zu erstellen, sollten Sie eine Klasse erstellen, die die IRouteConstraint-Schnittstelle erweitert und deren Match-Methode implementiert. Die Einschränkung kann verwendet werden, um unerwünschte eingehende Anforderungen zu vereiteln und zu verhindern, dass eine Route abgeglichen wird, sofern eine bestimmte Bedingung nicht erfüllt ist. Beispielsweise möchten Sie möglicherweise sicherstellen, dass der an eine Aktionsmethode übergebene Parameter immer eine Ganzzahl ist.

Die Match-Methode akzeptiert die folgenden Parameter:

  • HttpContext - kapselt alle HTTP-spezifischen Informationen zu einer Anforderung
  • IRouter - Stellt den Router dar, der die Einschränkungen anwendet
  • RouteKey - repräsentiert den Routenparameter, der validiert wird
  • RouteDirection - Eine Aufzählung, die zwei Werte enthält, nämlich IncomingRequest und UrlGeneration, und die angibt, ob die URL aus der HTTP-Anforderung verarbeitet oder eine URL generiert wird
  • RouteValues ​​- enthält die URL-Parameter

Struktur einer benutzerdefinierten Routenbeschränkung in ASP.NET Core

Hier ist ein Beispiel für die Struktur einer benutzerdefinierten Routenbeschränkung:

öffentliche Klasse CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, IRouter-Route,

        Zeichenfolge routeKey, RouteValueDictionary-Werte,

        RouteDirection routeDirection)

        {

            neue NotImplementedException () auslösen;

        }}

    }}

Beispiel für eine benutzerdefinierte Routenbeschränkung in ASP.NET Core

Lassen Sie uns nun eine benutzerdefinierte Routenbeschränkung implementieren, mit der nach E-Mail-IDs gesucht werden kann. Erstellen Sie zunächst eine Klasse, die die IRouteConstraint-Schnittstelle erweitert und die Match-Methode implementiert. Das folgende Codefragment zeigt eine benutzerdefinierte Routenbeschränkungsklasse mit dem Namen EmailRouteContraint, die die IRouteConstraint-Schnittstelle erweitert.

öffentliche Klasse EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, IRouter-Route,

        Zeichenfolge routeKey, RouteValueDictionary-Werte,

        RouteDirection routeDirection)

        {

            return true;

        }}

    }}

Die folgende Codeliste zeigt die EmailRouteConstraint-Klasse mit der implementierten Match-Methode.

öffentliche Klasse EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, IRouter-Route,

        Zeichenfolge routeKey, RouteValueDictionary-Werte,

        RouteDirection routeDirection)

        {

            if (values.TryGetValue (routeKey, out var routeValue))

            {

                var parameterValueString = Convert.ToString (routeValue,

                CultureInfo.InvariantCulture);

                return IsEmailAddressValid (parameterValueString);

            }}

            falsch zurückgeben;

        }}

        private bool IsEmailAddressValid (Zeichenfolge emailAddress)

        {

            return true;

        }}

    }}

Beachten Sie, dass die IsEmailAddressValid-Methode hier einfach "true" zurückgibt. Ich überlasse es Ihnen, den erforderlichen Code zur Validierung der E-Mail-Adresse zu schreiben.

Registrieren Sie eine benutzerdefinierte Routenbeschränkung in ASP.NET Core

Sie sollten Ihre benutzerdefinierte Routenbeschränkung beim Routingsystem in der ConfigureServices-Methode der Startup-Klasse registrieren. Das folgende Codefragment veranschaulicht dies. 

public void ConfigureServices (IServiceCollection-Dienste)

      {

          services.AddControllersWithViews ();

          services.Configure (routeOptions =>

          {

              routeOptions.ConstraintMap.Add ("ERC",

              typeof (EmailRouteContraint));

          });

      }}

Sie sollten Ihre benutzerdefinierte Routenbeschränkung auch in der Configure-Methode der Startup-Klasse konfigurieren, wie im folgenden Codeausschnitt gezeigt.

app.UseEndpoints (Endpunkte =>

{

     endpoints.MapControllerRoute (

         Name: "Standard",

         Einschränkungen: new {ERC = new EmailRouteContraint ()},

         Muster: "{controller = Home} / {action = Index} / {id?}");

});

Und das ist es. Sie können jetzt die Einschränkung in Ihrem Controller oder Ihren Aktionsmethoden angeben und die Anwendung verwenden.

Die ASP.NET Core-Laufzeit überprüft, ob die definierten Muster- und Routenbeschränkungen mit dem Muster und den Werten der eingehenden Anforderung übereinstimmen. Die Validierungslogik der Einschränkung wird in der Match-Methode Ihrer benutzerdefinierten Routenbeschränkung definiert. Sie können Einschränkungen nutzen, um unnötige Anforderungen zu vermeiden und Routenwerte zu überprüfen, bevor die Anforderung an eine Aktionsmethode übergeben wird.

So machen Sie mehr in ASP.NET Core:

  • So verwalten Sie Benutzergeheimnisse in ASP.NET Core
  • So erstellen Sie gRPC-Anwendungen in ASP.NET Core
  • So leiten Sie eine Anforderung in ASP.NET Core um
  • Verwendung des Attributroutings in ASP.NET Core
  • Übergeben von Parametern an Aktionsmethoden in ASP.NET Core MVC
  • Verwendung von API-Analysatoren in ASP.NET Core
  • So verwenden Sie Routendatentoken in ASP.NET Core
  • Verwendung der API-Versionierung in ASP.NET Core
  • Verwendung von Datenübertragungsobjekten in ASP.NET Core 3.1
  • Behandlung von 404-Fehlern in ASP.NET Core MVC
  • Verwendung der Abhängigkeitsinjektion in Aktionsfiltern in ASP.NET Core 3.1
  • Verwendung des Optionsmusters in ASP.NET Core
  • Verwendung des Endpunktroutings in ASP.NET Core 3.0 MVC
  • Exportieren von Daten nach Excel in ASP.NET Core 3.0
  • Verwendung von LoggerMessage in ASP.NET Core 3.0
  • So senden Sie E-Mails in ASP.NET Core
  • So protokollieren Sie Daten in SQL Server in ASP.NET Core
  • So planen Sie Jobs mit Quartz.NET in ASP.NET Core
  • So geben Sie Daten von der ASP.NET Core Web API zurück
  • So formatieren Sie Antwortdaten in ASP.NET Core
  • So verwenden Sie eine ASP.NET Core-Web-API mit RestSharp
  • So führen Sie asynchrone Vorgänge mit Dapper aus
  • Verwendung von Feature-Flags in ASP.NET Core
  • Verwendung des FromServices-Attributs in ASP.NET Core
  • So arbeiten Sie mit Cookies in ASP.NET Core
  • So arbeiten Sie mit statischen Dateien in ASP.NET Core
  • Verwendung der URL-Rewriting-Middleware in ASP.NET Core
  • Implementieren der Ratenbegrenzung in ASP.NET Core
  • So verwenden Sie Azure Application Insights in ASP.NET Core
  • Verwenden erweiterter NLog-Funktionen in ASP.NET Core
  • Behandlung von Fehlern in der ASP.NET-Web-API
  • Implementieren der globalen Ausnahmebehandlung in ASP.NET Core MVC
  • Umgang mit Nullwerten in ASP.NET Core MVC
  • Erweiterte Versionierung in der ASP.NET Core-Web-API
  • So arbeiten Sie mit Worker Services in ASP.NET Core
  • Verwendung der Datenschutz-API in ASP.NET Core
  • Verwendung der bedingten Middleware in ASP.NET Core
  • So arbeiten Sie mit dem Sitzungsstatus in ASP.NET Core
  • So schreiben Sie effiziente Controller in ASP.NET Core