Jak pracować z HttpModules w ASP.NET

Istnieją dwa sposoby wprowadzania logiki w potoku żądań aplikacji ASP.NET - HttpHandlers i HttpModules. HttpModule to składnik, który jest częścią potoku przetwarzania żądań ASP.NET i jest wywoływany przy każdym żądaniu skierowanym do aplikacji.

Należy pamiętać, że HttpModules mogą mieć dostęp do zdarzeń cyklu życia żądania, a zatem mogą być również używane do modyfikowania odpowiedzi. HttpModules są zwykle używane do podłączania problemów związanych z cięciem krzyżowym, takich jak bezpieczeństwo, logowanie itp. W potoku przetwarzania żądań, a także mogą być używane do ponownego zapisywania adresu URL, a nawet do tworzenia niestandardowych nagłówków w odpowiedzi.

Zgodnie z dokumentacją firmy Microsoft „Moduł HTTP to zestaw wywoływany przy każdym żądaniu skierowanym do aplikacji. Moduły HTTP są wywoływane jako część potoku żądań ASP.NET i mają dostęp do zdarzeń cyklu życia w całym żądaniu. Moduły HTTP umożliwiają badanie przychodzących i wychodzących żądań oraz podejmowanie działań na ich podstawie ”.

Aby utworzyć niestandardowy HttpModule, należy utworzyć klasę implementującą interfejs System.Web.IHttpModule. Aby utworzyć HttpModule, wykonaj następujące kroki:

  1. Otwórz Visual Studio IDE
  2. Kliknij Plik-> Nowy projekt
  3. Utwórz projekt biblioteki klas
  4. Dodaj odwołanie do zestawu System.Web do tego projektu
  5. Następnie utwórz klasę w tym projekcie, która implementuje interfejs IHttpModule
  6. Napisz procedurę obsługi dla metody Init, aby zainicjować moduł i zasubskrybować jedno lub więcej zdarzeń
  7. Opcjonalnie zaimplementuj metodę Dispose w module niestandardowym

Na pierwszy rzut oka nasz niestandardowy HttpModule wygląda następująco:

publiczna klasa CustomHttpModule: IHttpModule

   {

       public void Dispose ()

       {

           wyrzucić nowy NotImplementedException ();

       }

       public void Init (kontekst HttpApplication)

       {

           wyrzucić nowy NotImplementedException ();

       }

   }

Poniższy fragment kodu pokazuje, jak można subskrybować zdarzenia w niestandardowym module HTTP.

public void Init (kontekst HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);            

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

Napiszmy teraz kod dla metody OnLogRequest. Ta metoda jest przeznaczona do rejestrowania ścieżki lub każdego żądania do pliku tekstowego. Oto jak powinna wyglądać metoda OnLogRequest:

public void OnLogRequest (nadawca obiektu, EventArgs e)

       {

           HttpContext context = ((HttpApplication) nadawca) .Context;

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

           using (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

Poniższy kod ilustruje kompletny niestandardowy moduł HTTP.

publiczna klasa CustomModule: IHttpModule

   {

       public void Init (kontekst HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);          

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

       public void OnLogRequest (nadawca obiektu, EventArgs e)

       {

           HttpContext context = ((HttpApplication) nadawca) .Context;

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

           using (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       public void OnBeginRequest (nadawca obiektu, EventArgs e)

       {

           // Wpisz tutaj swój własny kod

       }

       public void OnEndRequest (nadawca obiektu, EventArgs e)

       {

           // Wpisz tutaj swój własny kod

       }

       public void Dispose ()

       {

           // Napisz tutaj swój niestandardowy kod, aby w razie potrzeby usunąć wszelkie obiekty

       }

   }

Następnym krokiem jest użycie niestandardowego modułu HTTP. Aby to zrobić, utwórz kolejny projekt (tym razem projekt aplikacji ASP.NET). Najpierw skompiluj rozwiązanie i dodaj odniesienie do właśnie utworzonego niestandardowego modułu HTTP.

Następnie musisz zarejestrować niestandardowy moduł HTTP w pliku web.config. Poniższy fragment kodu ilustruje, jak można zarejestrować niestandardowy moduł HTTP.

I to wszystko, co musisz zrobić, aby użyć niestandardowego modułu HTTP.

W przypadku korzystania z synchronicznego modułu HTTP wątek nie zostałby zwolniony, dopóki przetwarzanie żądania nie zostanie zakończone. Może to stać się głównym wąskim gardłem wydajności, gdy niestandardowy moduł HTTP musi wykonywać długotrwałe operacje związane z we / wy. Aby rozwiązać ten problem, możesz skorzystać z programowania asynchronicznego, aby zaimplementować również asynchroniczny moduł HTTP. Zapewniłoby to, że wydajność aplikacji nie spada, gdy moduł HTTP musi wykonać dużo przetwarzania. Programowanie asynchroniczne pomaga w lepszym wykorzystaniu dostępnych zasobów.

Aby zaimplementować asynchronię w niestandardowym module HTTP, warto skorzystać z klasy EventHandlerTaskAsyncHelper dostępnej jako część .NET Framework 4.5. Poniższy fragment kodu ilustruje, w jaki sposób można wykorzystać tę klasę do subskrybowania zdarzeń w metodzie Init niestandardowego modułu HTTP. Należy zauważyć, że metoda LogRequest powinna zwracać wystąpienie typu Task.

public void Init (kontekst HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Oto pełna lista kodu asynchronicznej wersji naszego niestandardowego modułu HTTP.

publiczna klasa CustomModule: IHttpModule

   {

       public void Init (kontekst HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       prywatne żądanie LogRequest async (nadawca obiektu, EventArgs e)

       {

           HttpContext context = ((HttpApplication) nadawca) .Context;

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

            using (StreamWriter streamWriter = new StreamWriter (filePath, true))

           {

               await streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Jak zrobić więcej w ASP.NET i ASP.NET Core:

  • Jak korzystać z buforowania w pamięci w ASP.NET Core
  • Jak obsługiwać błędy w ASP.NET Web API
  • Jak przekazać wiele parametrów do metod kontrolera interfejsu API sieci Web
  • Jak rejestrować metadane żądań i odpowiedzi w ASP.NET Web API
  • Jak pracować z HttpModules w ASP.NET
  • Zaawansowane przechowywanie wersji w ASP.NET Core Web API
  • Jak używać iniekcji zależności w ASP.NET Core
  • Jak pracować z sesjami w ASP.NET
  • Jak pracować z HTTPHandlers w ASP.NET
  • Jak używać IHostedService w ASP.NET Core
  • Jak korzystać z usługi WCF SOAP w ASP.NET Core
  • Jak poprawić wydajność aplikacji ASP.NET Core
  • Jak korzystać z ASP.NET Core Web API przy użyciu RestSharp
  • Jak pracować z rejestrowaniem w ASP.NET Core
  • Jak używać MediatR w ASP.NET Core
  • Jak pracować ze stanem sesji w ASP.NET Core
  • Jak używać Nancy w ASP.NET Core
  • Zrozumienie powiązania parametrów w ASP.NET Web API
  • Jak przekazywać pliki w ASP.NET Core MVC
  • Jak zaimplementować globalną obsługę wyjątków w ASP.NET Core Web API
  • Jak zaimplementować kontrole kondycji w ASP.NET Core
  • Najlepsze rozwiązania dotyczące buforowania w ASP.NET
  • Jak korzystać z obsługi wiadomości Apache Kafka w .NET
  • Jak włączyć CORS w swoim internetowym interfejsie API
  • Kiedy używać WebClient, HttpClient, a kiedy HttpWebRequest
  • Jak pracować z pamięcią podręczną Redis w .NET
  • Kiedy używać Task.WaitAll, a kiedy Task.WhenAll w .NET