Programmering

Hvordan jobbe med HttpModules i ASP.NET

Det er to måter du kan injisere logikk i forespørselsrørledningen til et ASP.NET-program - HttpHandlers og HttpModules. En HttpModule er en komponent som er en del av ASP.NET-prosesseringsrørledningen og kalles på hver forespørsel som blir gjort til søknaden din.

Merk at HttpModules kan ha tilgang til livssyklushendelsene til en forespørsel, og dermed kan de også brukes til å endre svaret. HttpModules brukes vanligvis til å plugge inn tverrgående bekymringer som sikkerhet, logging osv. I forespørselsrørledningen, og kan også brukes til URL-omskriving og til og med for å lage tilpassede overskrifter i svaret.

Som Microsofts dokumentasjon sier, “En HTTP-modul er en samling som kalles på hver forespørsel som blir gjort til applikasjonen din. HTTP-moduler kalles som en del av ASP.NET-forespørselsrørledningen og har tilgang til livssyklushendelser gjennom hele forespørselen. HTTP-moduler lar deg undersøke innkommende og utgående forespørsler og iverksette tiltak basert på forespørselen. ”

For å lage en tilpasset HttpModule, bør du opprette en klasse som implementerer System.Web.IHttpModule-grensesnittet. Følg disse trinnene for å opprette en HttpModule:

  1. Åpne Visual Studio IDE
  2. Klikk på Fil-> Nytt prosjekt
  3. Lag et klassebibliotekprosjekt
  4. Legg til referanse til System.Web-samling til dette prosjektet
  5. Deretter oppretter du en klasse i dette prosjektet som implementerer IHttpModule-grensesnittet
  6. Skriv en behandler for Init-metoden for å initialisere modulen og abonnere på en eller flere hendelser
  7. Eventuelt kan du implementere en Dispose-metode i din tilpassede modul

Ved første øyekast ser vår tilpassede HttpModule slik ut:

offentlig klasse CustomHttpModule: IHttpModule

   {

offentlig tomrom Kast ()

       {

kaste nye NotImplementedException ();

       }

offentlig ugyldig Init (HttpApplication context)

       {

kaste nye NotImplementedException ();

       }

   }

Følgende kodebit viser hvordan du kan abonnere på hendelser i din tilpassede HTTP-modul.

offentlig ugyldig Init (HttpApplication context)

       {

context.BeginRequest + = new EventHandler (OnBeginRequest);

context.EndRequest + = new EventHandler (OnEndRequest);

context.LogRequest + = ny EventHandler (OnLogRequest);

       }

La oss nå skrive koden for OnLogRequest-metoden. Denne metoden er ment å logge banen eller hver forespørsel til en tekstfil. Slik ser OnLogRequest-metoden ut:

offentlig ugyldig OnLogRequest (objektavsender, EventArgs e)

       {

HttpContext context = ((HttpApplication) avsender) .Context;

streng filePath = @ "D: \ Log.txt";

bruker (StreamWriter streamWriter = ny StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

Følgende kodeliste illustrerer den komplette tilpassede HTTP-modulen.

offentlig klasse CustomModule: IHttpModule

   {

offentlig ugyldig Init (HttpApplication context)

       {

context.BeginRequest + = new EventHandler (OnBeginRequest);

context.EndRequest + = new EventHandler (OnEndRequest);

context.LogRequest + = ny EventHandler (OnLogRequest);

       }

offentlig ugyldig OnLogRequest (objektavsender, EventArgs e)

       {

HttpContext context = ((HttpApplication) avsender) .Context;

streng filePath = @ "D: \ Log.txt";

bruker (StreamWriter streamWriter = ny StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

offentlig ugyldig OnBeginRequest (objektavsender, EventArgs e)

       {

// Skriv din tilpassede kode her

       }

offentlig ugyldig OnEndRequest (objektavsender, EventArgs e)

       {

// Skriv din tilpassede kode her

       }

offentlig tomrom Kast ()

       {

// Skriv din egendefinerte kode her for å avhende gjenstander om nødvendig

       }

   }

Neste trinn er å bruke den tilpassede HTTP-modulen. For å gjøre dette, opprett et nytt prosjekt (denne gangen, et ASP.NET applikasjonsprosjekt). Bygg først løsningen og legg til referanse til den tilpassede HTTP-modulen vi nettopp opprettet.

Deretter må du registrere den tilpassede HTTP-modulen i web.config-filen. Følgende kodebit illustrerer hvordan den tilpassede HTTP-modulen kan registreres.

Og det er alt du trenger å gjøre for å bruke din tilpassede HTTP-modul.

Når du bruker en synkron HTTP-modul, blir tråden ikke frigitt før behandlingen av forespørselen er fullført. Dette kan bli en viktig ytelsesflaskehals når den egendefinerte HTTP-modulen din trenger å utføre I / O-bundne operasjoner som kjører lenge. For å løse dette kan du dra nytte av asynkron programmering for å implementere en asynkron HTTP-modul også. Dette vil sikre at ytelsen til applikasjonen din ikke forringes når HTTP-modulen din trenger å behandle mye. Asynkron programmering hjelper til med bedre bruk av tilgjengelige ressurser.

For å implementere asynkroni i den tilpassede HTTP-modulen din, vil du bruke EventHandlerTaskAsyncHelper-klassen som er tilgjengelig som en del av .NET Framework 4.5. Følgende kodebit illustrerer hvordan du kan dra nytte av denne klassen for å abonnere på hendelser i Init-metoden til din tilpassede HTTP-modul. Merk at LogRequest-metoden skal returnere en forekomst av typen Task.

offentlig ugyldig Init (HttpApplication context)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = ny EventHandlerTaskAsyncHelper (LogRequest);

context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

Her er den komplette kodelisten for den asynkrone versjonen av vår tilpassede HTTP-modul.

offentlig klasse CustomModule: IHttpModule

   {

offentlig ugyldig Init (HttpApplication context)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = ny EventHandlerTaskAsyncHelper (LogRequest);

context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

private async Task LogRequest (objektavsender, EventArgs e)

       {

HttpContext context = ((HttpApplication) avsender) .Context;

streng filePath = @ "D: \ Log.txt";

bruker (StreamWriter streamWriter = ny StreamWriter (filePath, true))

           {

avvente streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Hvordan gjøre mer i ASP.NET og ASP.NET Core:

  • Hvordan bruke hurtigbufring i minnet i ASP.NET Core
  • Hvordan håndtere feil i ASP.NET Web API
  • Hvordan overføre flere parametere til Web API-kontrollermetoder
  • Hvordan logge forespørsels- og svarmetadata i ASP.NET Web API
  • Hvordan jobbe med HttpModules i ASP.NET
  • Avansert versjonering i ASP.NET Core Web API
  • Hvordan bruke avhengighetsinjeksjon i ASP.NET Core
  • Hvordan jobbe med økter i ASP.NET
  • Hvordan jobbe med HTTPHandlers i ASP.NET
  • Hvordan bruke IHostedService i ASP.NET Core
  • Hvordan forbruke en WCF SOAP-tjeneste i ASP.NET Core
  • Hvordan forbedre ytelsen til ASP.NET Core-applikasjoner
  • Slik bruker du et ASP.NET Core Web API ved hjelp av RestSharp
  • Hvordan jobbe med innlogging i ASP.NET Core
  • Hvordan bruke MediatR i ASP.NET Core
  • Hvordan jobbe med økttilstand i ASP.NET Core
  • Hvordan bruke Nancy i ASP.NET Core
  • Forstå parameterinnbinding i ASP.NET Web API
  • Hvordan laste opp filer i ASP.NET Core MVC
  • Hvordan implementere global unntaksbehandling i ASP.NET Core Web API
  • Hvordan implementere helsesjekker i ASP.NET Core
  • Beste fremgangsmåter for hurtigbufring i ASP.NET
  • Hvordan bruke Apache Kafka-meldinger i .NET
  • Hvordan aktivere CORS på web-API-et
  • Når skal du bruke WebClient vs. HttpClient vs. HttpWebRequest
  • Hvordan jobbe med Redis Cache i .NET
  • Når skal jeg bruke Task.WaitAll vs. Task.WhenAll i .NET
$config[zx-auto] not found$config[zx-overlay] not found