Как да работя с HttpModules в ASP.NET

Има два начина, по които можете да инжектирате логика в тръбопровода за заявки на приложение ASP.NET - HttpHandlers и HttpModules. HttpModule е компонент, който е част от конвейера за обработка на заявки ASP.NET и се извиква при всяка заявка, отправена към вашето приложение.

Имайте предвид, че HttpModules могат да имат достъп до събитията от жизнения цикъл на дадена заявка и следователно те могат да се използват и за модифициране на отговора. HttpModules обикновено се използват за включване на кръстосани проблеми като сигурност, регистриране и т.н. в тръбопровода за обработка на заявки и могат да се използват и за презаписване на URL адреси и дори за създаване на персонализирани заглавки в отговора.

Както се посочва в документацията на Microsoft, „HTTP модулът е сбор, който се извиква при всяка заявка, отправена към вашето приложение. HTTP модулите се извикват като част от конвейера за заявки ASP.NET и имат достъп до събития от жизнения цикъл по време на заявката. HTTP модулите ви позволяват да разглеждате входящите и изходящите заявки и да предприемате действия въз основа на заявката. "

За да създадете персонализиран HttpModule, трябва да създадете клас, който реализира интерфейса System.Web.IHttpModule. За да създадете HttpModule, изпълнете следните стъпки:

  1. Отворете Visual Studio IDE
  2. Кликнете върху Файл-> Нов проект
  3. Създайте проект за библиотека на класове
  4. Добавете препратка към сборката System.Web към този проект
  5. След това създайте клас в този проект, който реализира интерфейса IHttpModule
  6. Напишете манипулатор за метода Init, за да инициализирате вашия модул и да се абонирате за едно или повече събития
  7. По желание внедрете метод Dispose във вашия персонализиран модул

На пръв поглед нашият персонализиран HttpModule изглежда така:

публичен клас CustomHttpModule: IHttpModule

   {

       публично невалидно разпореждане ()

       {

           хвърли нов NotImplementedException ();

       }

       public void Init (контекст на HttpApplication)

       {

           хвърли нов NotImplementedException ();

       }

   }

Следният кодов фрагмент показва как можете да се абонирате за събития в вашия персонализиран HTTP модул.

public void Init (контекст на HttpApplication)

       {

           context.BeginRequest + = нов EventHandler (OnBeginRequest);

           context.EndRequest + = нов EventHandler (OnEndRequest);            

           context.LogRequest + = нов EventHandler (OnLogRequest);

       }

Нека сега напишем кода за метода OnLogRequest. Този метод е предназначен да регистрира пътя или всяка заявка към текстов файл. Ето как трябва да изглежда методът OnLogRequest:

публична невалидна OnLogRequest (подател на обект, EventArgs e)

       {

           HttpContext context = ((HttpApplication) подател) .Context;

           низ filePath = @ "D: \ Log.txt";

           използвайки (StreamWriter streamWriter = нов StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

Следният списък с кодове илюстрира пълния персонализиран HTTP модул.

публичен клас CustomModule: IHttpModule

   {

       public void Init (контекст на HttpApplication)

       {

           context.BeginRequest + = нов EventHandler (OnBeginRequest);

           context.EndRequest + = нов EventHandler (OnEndRequest);          

           context.LogRequest + = нов EventHandler (OnLogRequest);

       }

       публична невалидна OnLogRequest (подател на обект, EventArgs e)

       {

           HttpContext context = ((HttpApplication) подател) .Context;

           низ filePath = @ "D: \ Log.txt";

           използвайки (StreamWriter streamWriter = нов StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       публична невалидна OnBeginRequest (подател на обект, EventArgs e)

       {

           // Напишете вашия персонализиран код тук

       }

       публична невалидна OnEndRequest (подател на обект, EventArgs e)

       {

           // Напишете вашия персонализиран код тук

       }

       публично невалидно разпореждане ()

       {

           // Напишете вашия персонализиран код тук, за да изхвърлите всякакви обекти, ако е необходимо

       }

   }

Следващата стъпка е да използвате персонализирания HTTP модул. За да направите това, създайте друг проект (този път проект за приложение на ASP.NET). Първо, изградете решението и добавете препратка към току-що създадения от нас HTTP модул.

След това ще трябва да регистрирате персонализирания HTTP модул във файла web.config. Следният кодов фрагмент илюстрира как потребителският HTTP модул може да бъде регистриран.

И това е всичко, което трябва да направите, за да използвате вашия персонализиран HTTP модул.

Когато използвате синхронен HTTP модул, нишката няма да бъде освободена, докато обработката на заявката не завърши. Това може да се превърне в голямо пречка за производителността, когато вашият персонализиран HTTP модул трябва да изпълнява продължително изпълнени операции за I / O. За да разрешите това, можете да се възползвате от асинхронното програмиране, за да внедрите и асинхронен HTTP модул. Това би гарантирало, че производителността на вашето приложение няма да се влоши, когато вашият HTTP модул трябва да извърши много обработка. Асинхронното програмиране помага за по-доброто използване на наличните ресурси.

За да внедрите асинхронност във вашия персонализиран HTTP модул, бихте искали да използвате класа EventHandlerTaskAsyncHelper, наличен като част от .NET Framework 4.5. Следният кодов фрагмент илюстрира как можете да се възползвате от този клас, за да се абонирате за събития в метода Init на вашия персонализиран HTTP модул. Обърнете внимание, че методът LogRequest трябва да върне екземпляр от тип Task.

public void Init (контекст на HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = нов EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Ето пълния списък с кодове на асинхронната версия на нашия потребителски HTTP модул.

публичен клас CustomModule: IHttpModule

   {

       public void Init (контекст на HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = нов EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       private async Task LogRequest (подател на обект, EventArgs e)

       {

           HttpContext context = ((HttpApplication) подател) .Context;

           низ filePath = @ "D: \ Log.txt";

            използвайки (StreamWriter streamWriter = нов StreamWriter (filePath, true))

           {

               изчаквам streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Как да направите повече в ASP.NET и ASP.NET Core:

  • Как да използвам кеширането в паметта в ASP.NET Core
  • Как да се справим с грешки в ASP.NET Web API
  • Как да предавам множество параметри на методите на контролера на Web API
  • Как да регистрирам метаданни за заявки и отговори в ASP.NET Web API
  • Как да работя с HttpModules в ASP.NET
  • Разширено създаване на версии в ASP.NET Core Web API
  • Как да използвам инжектиране на зависимост в ASP.NET Core
  • Как да работите със сесии в ASP.NET
  • Как да работя с HTTPHandlers в ASP.NET
  • Как да използвам IHostedService в ASP.NET Core
  • Как да консумираме услуга WCF SOAP в ASP.NET Core
  • Как да подобрите производителността на приложенията на ASP.NET Core
  • Как да консумирате ASP.NET Core Web API с помощта на RestSharp
  • Как да работя с регистриране в ASP.NET Core
  • Как да използвам MediatR в ASP.NET Core
  • Как да работите със състоянието на сесията в ASP.NET Core
  • Как да използвам Nancy в ASP.NET Core
  • Разберете обвързването на параметри в ASP.NET Web API
  • Как да качвате файлове в ASP.NET Core MVC
  • Как да приложим обработка на глобални изключения в ASP.NET Core Web API
  • Как да приложим проверки на състоянието в ASP.NET Core
  • Най-добри практики за кеширане в ASP.NET
  • Как да използвам съобщенията на Apache Kafka в .NET
  • Как да активирате CORS на вашия уеб API
  • Кога да се използва WebClient срещу HttpClient срещу HttpWebRequest
  • Как да работите с Redis Cache в .NET
  • Кога да използвате Task.WaitAll срещу Task.WhenAll в .NET