Programovanie

Ako pracovať s HttpModules v ASP.NET

Existujú dva spôsoby, ako môžete vložiť logiku do kanálu požiadaviek aplikácie ASP.NET - HttpHandlers a HttpModules. HttpModule je komponent, ktorý je súčasťou potrubia spracovania požiadaviek ASP.NET a je volaný pri každej požiadavke vykonanej vo vašej aplikácii.

Upozorňujeme, že HttpModules môžu mať prístup k udalostiam životného cyklu žiadosti, a preto ich možno použiť aj na úpravu odpovede. HttpModules sa zvyčajne používajú na zapojenie prierezových problémov, ako je bezpečnosť, protokolovanie atď. Do potrubia spracovania požiadaviek, a môžu sa tiež použiť na prepísanie adresy URL a dokonca na vytvorenie vlastných hlavičiek v odpovedi.

Ako sa uvádza v dokumentácii spoločnosti Microsoft: „Modul HTTP je zostava, ktorá sa volá pri každej žiadosti odoslanej do vašej aplikácie. Moduly HTTP sa volajú ako súčasť potrubia požiadaviek ASP.NET a majú prístup k udalostiam životného cyklu počas celej požiadavky. Moduly HTTP vám umožňujú preskúmať prichádzajúce a odchádzajúce požiadavky a na základe žiadosti konať. “

Ak chcete vytvoriť vlastný modul HttpModule, mali by ste vytvoriť triedu, ktorá implementuje rozhranie System.Web.IHttpModule. Pri vytváraní modulu HttpModule postupujte nasledovne:

  1. Otvorte Visual Studio IDE
  2. Kliknite na Súbor-> Nový projekt
  3. Vytvorte projekt triednej knižnice
  4. Pridajte do tohto projektu odkaz na zostavu System.Web
  5. Ďalej v tomto projekte vytvorte triedu, ktorá implementuje rozhranie IHttpModule
  6. Napíšte obslužný program pre metódu Init na inicializáciu vášho modulu a prihlásenie na odber jednej alebo viacerých udalostí
  7. Voliteľne môžete do vlastného modulu implementovať metódu Dispose

Na prvý pohľad vyzerá náš vlastný modul HttpModule takto:

verejná trieda CustomHttpModule: IHttpModule

   {

public void Dispose ()

       {

hodiť nový NotImplementedException ();

       }

public void Init (kontext HttpApplication)

       {

hodiť nový NotImplementedException ();

       }

   }

Nasledujúci úryvok kódu ukazuje, ako sa môžete prihlásiť na odber udalostí vo vašom vlastnom module HTTP.

public void Init (kontext HttpApplication)

       {

context.BeginRequest + = nový EventHandler (OnBeginRequest);

context.EndRequest + = nový EventHandler (OnEndRequest);

context.LogRequest + = nový EventHandler (OnLogRequest);

       }

Poďme si teraz napísať kód pre metódu OnLogRequest. Táto metóda je určená na zaznamenanie cesty alebo každej požiadavky do textového súboru. Takto by mala vyzerať metóda OnLogRequest:

public void OnLogRequest (odosielateľ objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odosielateľ) .Context;

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

pomocou (StreamWriter streamWriter = nový StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

Nasledujúci zoznam kódov ilustruje kompletný vlastný modul HTTP.

verejná trieda CustomModule: IHttpModule

   {

public void Init (kontext HttpApplication)

       {

context.BeginRequest + = nový EventHandler (OnBeginRequest);

context.EndRequest + = nový EventHandler (OnEndRequest);

context.LogRequest + = nový EventHandler (OnLogRequest);

       }

public void OnLogRequest (odosielateľ objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odosielateľ) .Context;

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

pomocou (StreamWriter streamWriter = nový StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

public void OnBeginRequest (odosielateľ objektu, EventArgs e)

       {

// Sem napíš svoj vlastný kód

       }

public void OnEndRequest (odosielateľ objektu, EventArgs e)

       {

// Sem napíš svoj vlastný kód

       }

public void Dispose ()

       {

// Sem napíšte svoj vlastný kód, aby ste v prípade potreby zlikvidovali akékoľvek objekty

       }

   }

Ďalším krokom je použitie vlastného modulu HTTP. Za týmto účelom vytvorte ďalší projekt (tentokrát projekt aplikácie ASP.NET). Najskôr vytvorte riešenie a pridajte odkaz na vlastný modul HTTP, ktorý sme práve vytvorili.

Ďalej budete musieť zaregistrovať vlastný modul HTTP v súbore web.config. Nasledujúci úryvok kódu ilustruje, ako je možné zaregistrovať vlastný modul HTTP.

A to je všetko, čo musíte urobiť, aby ste mohli používať svoj vlastný modul HTTP.

Pri použití synchrónneho modulu HTTP by sa vlákno neuvoľnilo, kým sa nedokončí spracovanie žiadosti. Toto sa môže stať hlavným prekážkou výkonu, keď váš vlastný modul HTTP potrebuje na vykonávanie dlhotrvajúcich operácií viazaných na I / O. Ak to chcete vyriešiť, môžete využiť výhody asynchrónneho programovania aj na implementáciu asynchrónneho modulu HTTP. Takto by sa zabezpečilo, že výkon vašej aplikácie sa nezníži, keď váš modul HTTP bude musieť vykonať veľa spracovania. Asynchrónne programovanie pomáha pri lepšom využívaní dostupných zdrojov.

Na implementáciu asynchrónie vo vašom vlastnom module HTTP by ste chceli využiť triedu EventHandlerTaskAsyncHelper, ktorá je k dispozícii ako súčasť .NET Framework 4.5. Nasledujúci úryvok kódu ilustruje, ako môžete využiť túto triedu na prihlásenie na odber udalostí v metóde Init vášho vlastného modulu HTTP. Všimnite si, že metóda LogRequest by mala vrátiť inštanciu typu Task.

public void Init (kontext HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = nový EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Tu je kompletný zoznam kódov asynchrónnej verzie nášho vlastného modulu HTTP.

verejná trieda CustomModule: IHttpModule

   {

public void Init (kontext HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = nový EventHandlerTaskAsyncHelper (LogRequest);

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

       }

private async Task LogRequest (odosielateľ objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odosielateľ) .Context;

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

pomocou (StreamWriter streamWriter = nový StreamWriter (filePath, true))

           {

čaká streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Ako urobiť viac v ASP.NET a ASP.NET Core:

  • Ako používať ukladanie do pamäte cache v ASP.NET Core
  • Ako spracovať chyby v webovom rozhraní API ASP.NET
  • Ako odovzdať viaceré parametre metódam radiča webového API
  • Ako prihlásiť metadáta požiadaviek a odpovedí do webového rozhrania ASP.NET Web API
  • Ako pracovať s HttpModules v ASP.NET
  • Pokročilé spravovanie verzií v webovom rozhraní API ASP.NET Core
  • Ako používať vkladanie závislostí v ASP.NET Core
  • Ako pracovať s reláciami v ASP.NET
  • Ako pracovať s HTTPHandlers v ASP.NET
  • Ako používať IHostedService v ASP.NET Core
  • Ako spotrebovať službu WCF SOAP v ASP.NET Core
  • Ako zlepšiť výkon aplikácií ASP.NET Core
  • Ako konzumovať webové rozhranie API ASP.NET Core pomocou nástroja RestSharp
  • Ako pracovať s prihlásením do ASP.NET Core
  • Ako používať MediatR v ASP.NET Core
  • Ako pracovať so stavom relácie v ASP.NET Core
  • Ako používať Nancy v ASP.NET Core
  • Pochopte väzbu parametrov vo webovom rozhraní API ASP.NET
  • Ako nahrávať súbory v ASP.NET Core MVC
  • Ako implementovať globálne spracovanie výnimiek v webovom rozhraní API ASP.NET Core
  • Ako implementovať kontroly stavu v ASP.NET Core
  • Najlepšie postupy pri ukladaní do pamäte cache v ASP.NET
  • Ako používať zasielanie správ Apache Kafka v .NET
  • Ako povoliť CORS vo vašom webovom rozhraní API
  • Kedy použiť WebClient vs. HttpClient vs. HttpWebRequest
  • Ako pracovať s Redis Cache v .NET
  • Kedy použiť Task.WaitAll vs. Task.WhenAll v .NET
$config[zx-auto] not found$config[zx-overlay] not found