Programování

Jak pracovat s HttpModules v ASP.NET

Existují dva způsoby, kterými můžete vložit logiku do kanálu požadavků aplikace ASP.NET - HttpHandlers a HttpModules. HttpModule je komponenta, která je součástí kanálu zpracování požadavků ASP.NET a je volána při každém požadavku provedeném ve vaší aplikaci.

Všimněte si, že HttpModules mohou mít přístup k událostem životního cyklu požadavku, a proto je lze použít také k úpravě odpovědi. HttpModules se obecně používají k připojení průřezových problémů, jako je zabezpečení, protokolování atd. V kanálu zpracování požadavků, a lze je také použít k přepisování adres URL a dokonce k vytváření vlastních záhlaví v odpovědi.

Jak uvádí dokumentace společnosti Microsoft: „Modul HTTP je sestavení, které je voláno při každém požadavku na vaši aplikaci. Moduly HTTP se nazývají jako součást kanálu požadavků ASP.NET a mají přístup k událostem životního cyklu v celém požadavku. Moduly HTTP vám umožňují prozkoumat příchozí a odchozí požadavky a na základě požadavku provést akci. “

Chcete-li vytvořit vlastní HttpModule, měli byste vytvořit třídu, která implementuje rozhraní System.Web.IHttpModule. Chcete-li vytvořit HttpModule, postupujte takto:

  1. Otevřete IDE sady Visual Studio
  2. Klikněte na Soubor-> Nový projekt
  3. Vytvořte projekt knihovny tříd
  4. Přidejte do tohoto projektu odkaz na sestavení System.Web
  5. Dále vytvořte třídu uvnitř tohoto projektu, která implementuje rozhraní IHttpModule
  6. Napište obslužnou rutinu pro metodu Init k inicializaci modulu a přihlášení k odběru jedné nebo více událostí
  7. Volitelně implementujte metodu Dispose ve vašem vlastním modulu

Na první pohled vypadá náš vlastní HttpModule takto:

veřejná třída CustomHttpModule: IHttpModule

   {

public void Dispose ()

       {

hodit nový NotImplementedException ();

       }

public void Init (kontext HttpApplication)

       {

hodit nový NotImplementedException ();

       }

   }

Následující fragment kódu ukazuje, jak se můžete přihlásit k odběru událostí ve vašem vlastním modulu HTTP.

public void Init (kontext HttpApplication)

       {

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

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

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

       }

Pojďme nyní napsat kód pro metodu OnLogRequest. Tato metoda je určena k protokolování cesty nebo každého požadavku do textového souboru. Zde by měla vypadat metoda OnLogRequest:

public void OnLogRequest (odesílatel objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odesílatel) .Context;

řetězec filePath = @ "D: \ Log.txt";

pomocí (StreamWriter streamWriter = nový StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

Následující seznam kódů ilustruje kompletní vlastní modul HTTP.

veřejná třída 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 (odesílatel objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odesílatel) .Context;

řetězec filePath = @ "D: \ Log.txt";

pomocí (StreamWriter streamWriter = nový StreamWriter (filePath))

           {

streamWriter.WriteLine (context.Request.Path);

           }

       }

public void OnBeginRequest (odesílatel objektu, EventArgs e)

       {

// Sem napište svůj vlastní kód

       }

public void OnEndRequest (odesílatel objektu, EventArgs e)

       {

// Sem napište svůj vlastní kód

       }

public void Dispose ()

       {

// Sem napište svůj vlastní kód, abyste v případě potřeby zlikvidovali jakékoli objekty

       }

   }

Dalším krokem je použití vlastního modulu HTTP. Chcete-li to provést, vytvořte jiný projekt (tentokrát projekt aplikace ASP.NET). Nejprve vytvořte řešení a přidejte odkaz na vlastní modul HTTP, který jsme právě vytvořili.

Dále budete muset zaregistrovat vlastní modul HTTP v souboru web.config. Následující fragment kódu ukazuje, jak lze zaregistrovat vlastní modul HTTP.

A to je vše, co musíte udělat, abyste mohli používat svůj vlastní modul HTTP.

Při použití synchronního modulu HTTP by vlákno nebylo uvolněno, dokud nebude zpracování požadavku dokončeno. To se může stát hlavním překážkou výkonu, když váš vlastní modul HTTP potřebuje provádět dlouhotrvající operace vázané na I / O. Chcete-li to vyřešit, můžete využít asynchronního programování také k implementaci asynchronního modulu HTTP. Tím by bylo zajištěno, že výkon vaší aplikace nedegraduje, když váš modul HTTP potřebuje hodně zpracovat. Asynchronní programování pomáhá lépe využívat dostupné zdroje.

Chcete-li implementovat asynchronii ve vašem vlastním modulu HTTP, chtěli byste využít třídu EventHandlerTaskAsyncHelper dostupnou jako součást .NET Framework 4.5. Následující fragment kódu ukazuje, jak můžete využít této třídy k odběru událostí v metodě Init vašeho vlastního modulu HTTP. Všimněte si, že metoda LogRequest by měla vrátit instanci typu Task.

public void Init (kontext HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = nový EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Zde je kompletní seznam kódů asynchronní verze našeho vlastního modulu HTTP.

veřejná třída CustomModule: IHttpModule

   {

public void Init (kontext HttpApplication)

       {

EventHandlerTaskAsyncHelper asyncHelperObject = nový EventHandlerTaskAsyncHelper (LogRequest);

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

       }

soukromá asynchronní úloha LogRequest (odesílatel objektu, EventArgs e)

       {

HttpContext context = ((HttpApplication) odesílatel) .Context;

řetězec filePath = @ "D: \ Log.txt";

pomocí (StreamWriter streamWriter = nový StreamWriter (filePath, true))

           {

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

           }

       }

   }

Jak udělat více v ASP.NET a ASP.NET Core:

  • Jak používat ukládání do mezipaměti v paměti ASP.NET Core
  • Jak zpracovat chyby v ASP.NET Web API
  • Jak předat více parametrů metodám webového kontroleru API
  • Jak protokolovat metadata požadavků a odpovědí ve webovém rozhraní API ASP.NET
  • Jak pracovat s HttpModules v ASP.NET
  • Pokročilé správy verzí v ASP.NET Core Web API
  • Jak používat vkládání závislostí v ASP.NET Core
  • Jak pracovat s relacemi v ASP.NET
  • Jak pracovat s HTTPHandlers v ASP.NET
  • Jak používat IHostedService v ASP.NET Core
  • Jak využívat službu WCF SOAP v ASP.NET Core
  • Jak zlepšit výkon aplikací ASP.NET Core
  • Jak konzumovat webové rozhraní API ASP.NET Core pomocí RestSharp
  • Jak pracovat s protokolováním v ASP.NET Core
  • Jak používat MediatR v ASP.NET Core
  • Jak pracovat se stavem relace v ASP.NET Core
  • Jak používat Nancy v ASP.NET Core
  • Vysvětlení vazby parametrů v ASP.NET Web API
  • Jak nahrávat soubory v ASP.NET Core MVC
  • Jak implementovat globální zpracování výjimek ve webovém rozhraní API ASP.NET Core
  • Jak implementovat kontroly stavu v ASP.NET Core
  • Osvědčené postupy při ukládání do mezipaměti v ASP.NET
  • Jak používat zasílání zpráv Apache Kafka v .NET
  • Jak povolit CORS ve vašem webovém rozhraní API
  • Kdy použít WebClient vs. HttpClient vs. HttpWebRequest
  • Jak pracovat s Redis Cache v .NET
  • Kdy použít Task.WaitAll vs. Task.WhenAll v .NET