Kako raditi s HttpModules-om u ASP.NET-u

Postoje dva načina na koja možete ubrizgati logiku u cjevovod zahtjeva ASP.NET aplikacije - HttpHandlers i HttpModules. HttpModule je komponenta koja je dio cjevovoda za obradu zahtjeva ASP.NET i poziva se na svaki zahtjev koji je upućen vašoj aplikaciji.

Imajte na umu da HttpModules mogu imati pristup događajima životnog ciklusa zahtjeva i stoga se mogu koristiti i za izmjenu odgovora. HttpModules se obično koriste za uključivanje unakrsnih problema kao što su sigurnost, zapisivanje itd. U cjevovod za obradu zahtjeva, a mogu se koristiti i za ponovno pisanje URL-a, pa čak i za stvaranje prilagođenih zaglavlja u odgovoru.

Kao što navodi Microsoftova dokumentacija, „HTTP modul je sklop koji se poziva na svaki zahtjev koji se uputi vašoj aplikaciji. HTTP moduli pozivaju se kao dio cjevovoda zahtjeva ASP.NET i imaju pristup događajima životnog ciklusa tijekom zahtjeva. HTTP moduli omogućuju vam pregled dolaznih i odlaznih zahtjeva i poduzimanje radnji na temelju zahtjeva. "

Da biste stvorili prilagođeni HttpModule, trebali biste stvoriti klasu koja implementira sučelje System.Web.IHttpModule. Da biste stvorili HttpModule, slijedite ove korake:

  1. Otvorite Visual Studio IDE
  2. Kliknite Datoteka-> Novi projekt
  3. Izradite projekt knjižnice razreda
  4. Ovom projektu dodajte referencu na sklop System.Web
  5. Zatim stvorite klasu unutar ovog projekta koja implementira sučelje IHttpModule
  6. Napišite voditelj za metodu Init za inicijalizaciju vašeg modula i pretplatu na jedan ili više događaja
  7. Po želji implementirajte Dispose metodu u svoj prilagođeni modul

Na prvi pogled naš prilagođeni HttpModule izgleda ovako:

javna klasa CustomHttpModule: IHttpModule

   {

       javna praznina Raspolagati ()

       {

           baciti novi NotImplementedException ();

       }

       javna void Init (kontekst HttpApplication)

       {

           baciti novi NotImplementedException ();

       }

   }

Sljedeći isječak koda pokazuje kako se možete pretplatiti na događaje u svom prilagođenom HTTP modulu.

javna void Init (kontekst HttpApplication)

       {

           context.BeginRequest + = novi EventHandler (OnBeginRequest);

           context.EndRequest + = novi EventHandler (OnEndRequest);            

           context.LogRequest + = novi EventHandler (OnLogRequest);

       }

Napišimo sada kod za metodu OnLogRequest. Ova metoda namijenjena je bilježenju putanje ili svakog zahtjeva u tekstualnu datoteku. Evo kako bi trebala izgledati metoda OnLogRequest:

javna void OnLogRequest (pošiljatelj objekta, EventArgs e)

       {

           HttpContext context = (((HttpApplication) pošiljatelj) .Context;

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

           pomoću (StreamWriter streamWriter = novi StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

Sljedeći popis kodova ilustrira kompletan prilagođeni HTTP modul.

javna klasa CustomModule: IHttpModule

   {

       javna void Init (kontekst HttpApplication)

       {

           context.BeginRequest + = novi EventHandler (OnBeginRequest);

           context.EndRequest + = novi EventHandler (OnEndRequest);          

           context.LogRequest + = novi EventHandler (OnLogRequest);

       }

       javna void OnLogRequest (pošiljatelj objekta, EventArgs e)

       {

           HttpContext context = (((HttpApplication) pošiljatelj) .Context;

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

           pomoću (StreamWriter streamWriter = novi StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       javna void OnBeginRequest (pošiljatelj objekta, EventArgs e)

       {

           // Ovdje napišite svoj prilagođeni kôd

       }

       javna void OnEndRequest (pošiljatelj objekta, EventArgs e)

       {

           // Ovdje napišite svoj prilagođeni kôd

       }

       javna praznina Raspolagati ()

       {

           // Ovdje napišite svoj prilagođeni kôd da biste po potrebi odlagali bilo kakve predmete

       }

   }

Sljedeći je korak uporaba prilagođenog HTTP modula. Da biste to učinili, izradite drugi projekt (ovaj put, projektni projekt ASP.NET). Prvo izradite rješenje i dodajte referencu na prilagođeni HTTP modul koji smo upravo stvorili.

Dalje, morat ćete registrirati prilagođeni HTTP modul u datoteci web.config. Sljedeći isječak koda ilustrira kako se može registrirati prilagođeni HTTP modul.

I to je sve što trebate učiniti da biste koristili svoj prilagođeni HTTP modul.

Kada se koristi sinkroni HTTP modul, nit se neće otpustiti dok se obrada zahtjeva ne dovrši. To može postati veliko usko grlo u izvedbi kada vaš prilagođeni HTTP modul treba izvoditi dugotrajne operacije vezane uz I / O. Da biste to riješili, možete iskoristiti asinkrono programiranje da biste implementirali i asinkroni HTTP modul. To bi osiguralo da se izvedba vaše aplikacije ne pogorša kada vaš HTTP modul treba obaviti puno obrade. Asinkrono programiranje pomaže u boljem korištenju dostupnih resursa.

Da biste implementirali asinkronost u svoj prilagođeni HTTP modul, trebali biste iskoristiti klasu EventHandlerTaskAsyncHelper koja je dostupna kao dio .NET Framework 4.5. Sljedeći isječak koda ilustrira kako možete iskoristiti ovu klasu za pretplatu na događaje u metodi Init vašeg prilagođenog HTTP modula. Napominjemo da bi metoda LogRequest trebala vratiti primjerak tipa Zadatak.

javna void Init (kontekst HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = novo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Evo kompletnog popisa kodova asinkrone verzije našeg prilagođenog HTTP modula.

javna klasa CustomModule: IHttpModule

   {

       javna void Init (kontekst HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = novo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       privatni async zadatak zadatka (zahtjev pošiljatelja, EventArgs e)

       {

           HttpContext context = (((HttpApplication) pošiljatelj) .Context;

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

            pomoću (StreamWriter streamWriter = novi StreamWriter (filePath, true))

           {

               čekati streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Kako učiniti više u ASP.NET i ASP.NET Core:

  • Kako se koristi predmemoriranje u memoriji u ASP.NET Core
  • Kako postupati s pogreškama u ASP.NET web API-ju
  • Kako proslijediti više parametara metodama kontrolera Web API-ja
  • Kako prijaviti metapodatke zahtjeva i odgovora u ASP.NET Web API
  • Kako raditi s HttpModules-om u ASP.NET-u
  • Napredna verzija u ASP.NET Core Web API
  • Kako se koristi ubrizgavanje ovisnosti u ASP.NET Core
  • Kako raditi sa sesijama u ASP.NET-u
  • Kako raditi s HTTPHandlerima u ASP.NET-u
  • Kako koristiti IHostedService u ASP.NET Core
  • Kako potrošiti WCF SOAP uslugu u ASP.NET Core
  • Kako poboljšati izvedbu ASP.NET Core aplikacija
  • Kako konzumirati ASP.NET Core Web API pomoću RestSharp
  • Kako raditi s prijavom u ASP.NET Core
  • Kako koristiti MediatR u ASP.NET Core
  • Kako raditi sa stanjem sesije u ASP.NET Coreu
  • Kako koristiti Nancy u ASP.NET Coreu
  • Razumijevanje vezivanja parametara u ASP.NET Web API-ju
  • Kako prenijeti datoteke u ASP.NET Core MVC
  • Kako implementirati rukovanje globalnim iznimkama u ASP.NET Core Web API
  • Kako implementirati provjere zdravlja u ASP.NET Core
  • Najbolji primjeri u predmemoriranju u ASP.NET-u
  • Kako koristiti Apache Kafka razmjenu poruka u .NET-u
  • Kako omogućiti CORS na vašem web API-ju
  • Kada koristiti WebClient u odnosu na HttpClient u odnosu na HttpWebRequest
  • Kako raditi s predmemorijom Redis u .NET-u
  • Kada koristiti Task.WaitAll vs. Task.WhenAll u .NET