Programiranje

Kako delati s HttpModules v ASP.NET

Obstajata dva načina za vbrizgavanje logike v cevovod zahtevka aplikacije ASP.NET - HttpHandlers in HttpModules. HttpModule je komponenta, ki je del cevovoda za obdelavo zahtev ASP.NET in se pokliče pri vsaki zahtevi, ki je poslana vaši aplikaciji.

Upoštevajte, da imajo HttpModules dostop do dogodkov življenjskega cikla zahteve in jih je zato mogoče uporabiti tudi za spreminjanje odziva. HttpModules se običajno uporabljajo za vključitev medsektorskih vprašanj, kot so varnost, beleženje itd. V cevovod za obdelavo zahtev, lahko pa se uporabljajo tudi za ponovno pisanje URL-jev in celo za ustvarjanje glav po meri v odgovoru.

Kot piše Microsoftova dokumentacija, »modul HTTP je sklop, ki se pokliče na vsako zahtevo, ki je poslana vaši aplikaciji. Moduli HTTP so poklicani kot del cevovoda zahtev ASP.NET in imajo dostop do dogodkov v življenjskem ciklu v celotni zahtevi. Moduli HTTP vam omogočajo, da preučite dohodne in odhodne zahteve in ukrepate na podlagi zahteve. "

Če želite ustvariti HttpModule po meri, morate ustvariti razred, ki implementira vmesnik System.Web.IHttpModule. Če želite ustvariti HttpModule, sledite tem korakom:

  1. Odprite Visual Studio IDE
  2. Kliknite Datoteka-> Nov projekt
  3. Ustvarite projekt knjižnice razredov
  4. Temu projektu dodajte sklic na sklop System.Web
  5. Nato v tem projektu ustvarite razred, ki izvaja vmesnik IHttpModule
  6. Napišite metodo za obdelavo metode Init, da inicializirate svoj modul in se naročite na enega ali več dogodkov
  7. Neobvezno v svoj modul po meri implementirajte metodo Dispose

Na prvi pogled je naš HttpModule po meri videti takole:

javni razred CustomHttpModule: IHttpModule

   {

javna void Dispose ()

       {

vrzi novo NotImplementedException ();

       }

public void Init (kontekst aplikacije HttpApplication)

       {

vrzi novo NotImplementedException ();

       }

   }

Naslednji delček kode prikazuje, kako se lahko naročite na dogodke v svojem modulu HTTP po meri.

public void Init (HttpApplication context)

       {

context.BeginRequest + = novi EventHandler (OnBeginRequest);

context.EndRequest + = newHendHandler (OnEndRequest);

context.LogRequest + = nov EventHandler (OnLogRequest);

       }

Napišimo zdaj kodo za metodo OnLogRequest. Ta metoda je namenjena beleženju poti ali vsake zahteve v besedilno datoteko. Metoda OnLogRequest bi morala izgledati tako:

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

       {

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

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

z uporabo (StreamWriter streamWriter = nov StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

Naslednji seznam kod ponazarja celoten modul HTTP po meri.

javni razred CustomModule: IHttpModule

   {

public void Init (kontekst aplikacije HttpApplication)

       {

context.BeginRequest + = novi EventHandler (OnBeginRequest);

context.EndRequest + = newHendHandler (OnEndRequest);

context.LogRequest + = newHendHandler (OnLogRequest);

       }

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

       {

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

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

z uporabo (StreamWriter streamWriter = nov StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

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

       {

// Tukaj napišite kodo po meri

       }

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

       {

// Tukaj napišite kodo po meri

       }

javna void Dispose ()

       {

// Tukaj napišite kodo po meri, če želite po potrebi odstraniti vse predmete

       }

   }

Naslednji korak je uporaba modula HTTP po meri. Če želite to narediti, ustvarite drug projekt (tokrat projekt aplikacije ASP.NET). Najprej zgradite rešitev in dodajte sklic na modul HTTP po meri, ki smo ga pravkar ustvarili.

Nato boste morali modul HTTP po meri registrirati v datoteki web.config. Naslednji delček kode prikazuje, kako je mogoče registrirati modul HTTP po meri.

In to je vse, kar morate storiti, da uporabite svoj modul HTTP po meri.

Ko uporabljate sinhroni modul HTTP, nit ne bo sproščena, dokler se obdelava zahteve ne konča. To lahko postane glavno ozko grlo, ko mora vaš modul HTTP po meri izvajati dolgotrajne operacije vezave V / I. Da bi to rešili, lahko asinhrono programiranje izkoristite tudi za izvedbo asinhronega modula HTTP. To bi zagotovilo, da se zmogljivost vaše aplikacije ne poslabša, ko mora vaš modul HTTP opraviti veliko obdelave. Asinhrono programiranje pomaga pri boljši uporabi razpoložljivih virov.

Za izvedbo asinhronosti v vašem modulu HTTP po meri bi želeli uporabiti razred EventHandlerTaskAsyncHelper, ki je na voljo kot del .NET Framework 4.5. Naslednji delček kode prikazuje, kako lahko izkoristite ta razred za naročanje na dogodke v metodi Init vašega modula HTTP po meri. Upoštevajte, da mora metoda LogRequest vrniti primerek tipa Task.

public void Init (kontekst aplikacije HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = novo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Tu je celoten seznam kod asinhrone različice našega modula HTTP po meri.

javni razred CustomModule: IHttpModule

   {

public void Init (kontekst aplikacije HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = novo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

zasebna async naloga opravila (pošiljatelj predmeta, EventArgs e)

       {

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

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

z uporabo (StreamWriter streamWriter = nov StreamWriter (filePath, true))

           {

počakajte streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Kako narediti več v ASP.NET in ASP.NET Core:

  • Kako uporabljati predpomnjenje v pomnilniku v ASP.NET Core
  • Kako ravnati z napakami v spletnem API-ju ASP.NET
  • Kako prenesti več parametrov v metode krmilnika spletnega API-ja
  • Kako zapisati metapodatke zahtev in odzivov v spletni API ASP.NET
  • Kako delati s HttpModules v ASP.NET
  • Napredno spreminjanje različic v ASP.NET Core Web API
  • Kako uporabiti vbrizgavanje odvisnosti v ASP.NET Core
  • Kako delati s sejami v ASP.NET
  • Kako delati z HTTPHandlers v ASP.NET
  • Kako uporabljati IHostedService v ASP.NET Core
  • Kako porabiti storitev WCF SOAP v ASP.NET Core
  • Kako izboljšati delovanje aplikacij ASP.NET Core
  • Kako porabiti spletni API ASP.NET Core s pomočjo RestSharp
  • Kako delati s prijavo v ASP.NET Core
  • Kako uporabljati MediatR v ASP.NET Core
  • Kako delati s stanjem seje v ASP.NET Core
  • Kako uporabljati Nancy v ASP.NET Core
  • Razumevanje vezave parametrov v spletnem API-ju ASP.NET
  • Kako naložiti datoteke v ASP.NET Core MVC
  • Kako implementirati globalno obravnavo izjem v ASP.NET Core Web API
  • Kako izvajati zdravstvene preglede v ASP.NET Core
  • Najboljše prakse predpomnjenja v ASP.NET
  • Kako uporabljati sporočila Apache Kafka v .NET
  • Kako omogočiti CORS v spletnem API-ju
  • Kdaj uporabiti WebClient v primerjavi s HttpClient v primerjavi s HttpWebRequest
  • Kako delati s predpomnilnikom Redis v .NET
  • Kdaj uporabiti Task.WaitAll v primerjavi z Task.WhenAll v .NET
$config[zx-auto] not found$config[zx-overlay] not found