Filtre i ASP.NET Core MVC tillater oss å utføre kode før eller etter bestemte stadier av forespørselsrørledningen. De forskjellige typene filtre samsvarer med de forskjellige trinnene i rørledningen, fra autorisasjon til resultatutførelse.
For eksempel kan du utnytte handlingsfiltre i ASP.NET Core MVC for å utføre tilpasset kode før og etter utførelsen av en handlingsmetode. Denne artikkelen presenterer en diskusjon om de innebygde filtrene i ASP.NET Core MVC, hvorfor de er nyttige, og hvordan vi kan bruke handlingsfiltre i ASP.NET Core-applikasjonene.
Filtre i ASP.NET Core MVC
ASP.NET Core MVC inneholder mange innebygde filtre. Disse inkluderer følgende:
- ActionFilters. Disse utføres før og etter utførelse av en handlingsmetode til en kontroller.
- AuthorizationFilters. Disse filtrene kjøres i begynnelsen av forespørselsrørledningen. De brukes til å validere brukerens legitimasjon for å sjekke om brukeren er autorisert.
- ResourceFilters. Disse filtrene kjøres etter autorisasjon og før modellinnbinding skjer. Du kan dra nytte av ResourceFilters for å implementere caching.
- ResultatFilter. Disse filtrene brukes til å utføre kode før og etter at en handlingsmetodes IActionResult er utført.
- ExceptionFilters. Disse filtrene brukes til å håndtere unntak som oppstår i rørledningen. Du kan dra nytte av ExceptionFilters for å utføre tilpasset kode når et unntak har oppstått.
Valget av filtertype du vil bruke, avhenger av hva du prøver å oppnå. Som et eksempel, hvis du prøver å kortslutte en forespørsel (dvs. stoppe en handlingsmetode fra å utføre og returnere et resultat for tidlig), vil du bruke et ressursfilter. Alternativt, hvis du prøver å endre parametere for handlingsmetoden og resultatet returnert fra handlingsmetoden, vil du bruke et handlingsfilter.
ActionFilterAttribute-klassen implementerer grensesnittene IActionFilter, IAsyncActionFilter, IResultFilter, IAsyncResultFilter og IOrderedFilter. Du kan dra nytte av denne klassen for å implementere et metodefilter, kontrollerfilter eller globalt filter. Vi vil undersøke dette senere i denne artikkelen.
Opprett et ASP.NET Core Web API-prosjekt i Visual Studio 2017
Først og fremst, la oss lage et ASP.NET Core Web API-prosjekt i Visual Studio. Hvis Visual Studio 2017 er i gang i systemet ditt, følger du trinnene nedenfor for å opprette et ASP.NET Core MVC-prosjekt.
- Start Visual Studio 2017 IDE.
- Klikk på Fil> Ny> Prosjekt.
- Velg “ASP.NET Core Web Application (.NET Core)” fra listen over maler som vises.
- Spesifiser et navn på prosjektet.
- Klikk OK for å lagre prosjektet.
- Et nytt vindu, "New .NET Core Web Application ...", vises.
- Velg .NET Core som kjøretid og ASP.NET Core 2.1 (eller nyere) fra rullegardinlisten øverst.
- Velg "Web Application (Model-View-Controller)" som prosjektmal.
- Forsikre deg om at avmerkingsboksene "Aktiver Docker-støtte" og "Konfigurer for HTTPS" ikke er merket av. Vi bruker ikke disse funksjonene her.
- Forsikre deg om at “Ingen godkjenning” er valgt. Vi bruker ikke autentisering her heller.
Dette vil skape et nytt ASP.NET Core MVC-prosjekt i Visual Studio. Vi bruker dette prosjektet til å implementere handlingsfiltrene i avsnittene som følger.
Opprett et tilpasset handlingsfilter i ASP.NET Core MVC
Du kan dra nytte av egendefinerte handlingsfiltre for å utføre gjenbrukbar kode før eller etter kjøring av en handlingsmetode. Du kan utvide følgende abstrakte baseklasser for å lage tilpassede filtre. Merk at hver av disse abstrakte klassene utvider attributtklassen.
- ActionFilterAttribute
- ResultatFilterAttribute
- ExceptionFilterAttribute
- ServiceFilterAttribute
- TypeFilterAttribute
Du kan også utvide IActionFilter-grensesnittet og implementere metodene for å lage et tilpasset filter. Du kan opprette både synkrone og asynkrone filtre.
Opprett et synkront handlingsfilter i ASP.NET Core MVC
Følgende kodebit illustrerer hvordan et synkront handlingsfilter kan opprettes ved å utvide IActionFilter-grensesnittet og implementere metodene OnActionExecuting og OnActionExecuted.
offentlig klasse SimpleActionFilter: IActionFilter{
offentlig ugyldig OnActionExecuting (ActionExecutingContext context)
{
// denne metoden vil bli utført før kjøring av en handlingsmetode
}
offentlig ugyldig OnActionExecuted (ActionExecutedContext context)
{
// denne metoden blir utført etter at en handlingsmetode er utført
}
}
Opprett et asynkront handlingsfilter i ASP.NET Core MVC
For å opprette et asynkront handlingsfilter kan du utvide IAsyncActionFilter-grensesnittet og implementere OnActionExecutionAsync-metoden som vist i kodebiten nedenfor.
offentlig klasse SimpleAsyncActionFilter: IAsyncActionFilter{
public async Task OnActionExecutionAsync (ActionExecutingContext context,
ActionExecutionDelegate neste)
{
// kode skrevet her vil bli utført før utførelse av en handlingsmetode
avvente neste ();
// kode skrevet her vil bli utført etter kjøring av en handlingsmetode
}
}
Legg til et handlingsfilter i ConfigureServices-metoden i ASP.NET Core
Du kan legge til filtre på forskjellige nivåer av omfang. Disse inkluderer handlingsomfang, kontrolleromfang og globalt omfang. Følgende kodebit illustrerer hvordan du kan legge til et filter i det globale omfanget. Legg merke til hvordan det tilpassede handlingsfilteret vi implementerte ovenfor blir lagt til filtersamlingen i ConfigureServices-metoden i oppstartklassen. Merk at filteret legges til filtersamlingen etter forekomst.
services.AddMvc (alternativer =>{
options.Filters.Add (ny SimpleAsyncActionFilter ());
SetCompatibilityVersion (CompatibilityVersion.Version_2_1);
Du kan også legge til filteret etter type som vist i kodebiten nedenfor.
services.AddMvc (alternativer =>{
options.Filters.Add (typeof (SimpleAsyncActionFilter));
SetCompatibilityVersion (CompatibilityVersion.Version_2_1);
Filtre lar deg utføre kode før eller etter et bestemt punkt i forespørselsrørledningen. En av de store nye forbedringene i handlingsfiltre i ASP.NET Core MVC er muligheten til å spesifisere kjøringsrekkefølgen for filteret i HTTP-forespørselsrørledningen. Vi vil undersøke dette og mange flere funksjoner i filtre i ASP.NET Core MVC i et kommende innlegg.