ASP.NET에서 HttpModules를 사용하는 방법

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

   {

       공공 무효 Dispose ()

       {

           새로운 NotImplementedException ();

       }

       public void Init (HttpApplication 컨텍스트)

       {

           새로운 NotImplementedException ();

       }

   }

다음 코드 스 니펫은 사용자 정의 HTTP 모듈에서 이벤트를 구독하는 방법을 보여줍니다.

public void Init (HttpApplication 컨텍스트)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);            

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

이제 OnLogRequest 메서드에 대한 코드를 작성해 보겠습니다. 이 메소드는 경로 또는 모든 요청을 텍스트 파일에 기록하기위한 것입니다. OnLogRequest 메서드의 모습은 다음과 같습니다.

public void OnLogRequest (객체 발신자, EventArgs e)

       {

           HttpContext 컨텍스트 = ((HttpApplication) sender) .Context;

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

           (StreamWriter streamWriter = new StreamWriter (filePath)) 사용

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

다음 코드 목록은 완전한 사용자 정의 HTTP 모듈을 보여줍니다.

공용 클래스 CustomModule : IHttpModule

   {

       public void Init (HttpApplication 컨텍스트)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);          

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

       public void OnLogRequest (객체 발신자, EventArgs e)

       {

           HttpContext 컨텍스트 = ((HttpApplication) sender) .Context;

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

           (StreamWriter streamWriter = new StreamWriter (filePath)) 사용

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       public void OnBeginRequest (객체 발신자, EventArgs e)

       {

           // 여기에 사용자 정의 코드 작성

       }

       public void OnEndRequest (객체 발신자, EventArgs e)

       {

           // 여기에 사용자 정의 코드 작성

       }

       공공 무효 Dispose ()

       {

           // 필요한 경우 여기에 사용자 지정 코드를 작성하여 개체를 삭제합니다.

       }

   }

다음 단계는 사용자 지정 HTTP 모듈을 사용하는 것입니다. 이렇게하려면 다른 프로젝트 (이번에는 ASP.NET 응용 프로그램 프로젝트)를 만듭니다. 먼저 솔루션을 빌드하고 방금 만든 사용자 지정 HTTP 모듈에 대한 참조를 추가합니다.

다음으로 web.config 파일에 사용자 지정 HTTP 모듈을 등록해야합니다. 다음 코드 조각은 사용자 지정 HTTP 모듈을 등록하는 방법을 보여줍니다.

그리고 이것이 사용자 지정 HTTP 모듈을 사용하기 위해 수행해야하는 모든 것입니다.

동기 HTTP 모듈을 사용하는 경우 요청 처리가 완료 될 때까지 스레드가 해제되지 않습니다. 이는 사용자 지정 HTTP 모듈이 장기 실행 I / O 바인딩 작업을 수행해야 할 때 주요 성능 병목 현상이 될 수 있습니다. 이를 해결하기 위해 비동기 프로그래밍을 활용하여 비동기 HTTP 모듈도 구현할 수 있습니다. 이렇게하면 HTTP 모듈이 많은 처리를해야 할 때 애플리케이션의 성능이 저하되지 않습니다. 비동기 프로그래밍은 사용 가능한 리소스를 더 잘 사용하는 데 도움이됩니다.

사용자 지정 HTTP 모듈에서 비동기를 구현하려면 .NET Framework 4.5의 일부로 제공되는 EventHandlerTaskAsyncHelper 클래스를 활용해야합니다. 다음 코드 조각은이 클래스를 활용하여 사용자 지정 HTTP 모듈의 Init 메서드에서 이벤트를 구독하는 방법을 보여줍니다. 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);

       }

       개인 비동기 작업 LogRequest (개체 발신자, EventArgs e)

       {

           HttpContext 컨텍스트 = ((HttpApplication) sender) .Context;

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

            (StreamWriter streamWriter = new StreamWriter (filePath, true)) 사용

           {

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

           }

       }

   }

ASP.NET 및 ASP.NET Core에서 더 많은 작업을 수행하는 방법 :

  • ASP.NET Core에서 메모리 내 캐싱을 사용하는 방법
  • ASP.NET Web API에서 오류를 처리하는 방법
  • Web API 컨트롤러 메서드에 여러 매개 변수를 전달하는 방법
  • ASP.NET Web API에서 요청 및 응답 메타 데이터를 기록하는 방법
  • ASP.NET에서 HttpModules를 사용하는 방법
  • ASP.NET Core Web API의 고급 버전 관리
  • ASP.NET Core에서 종속성 주입을 사용하는 방법
  • ASP.NET에서 세션으로 작업하는 방법
  • ASP.NET에서 HTTPHandler를 사용하는 방법
  • ASP.NET Core에서 IHostedService를 사용하는 방법
  • ASP.NET Core에서 WCF SOAP 서비스를 사용하는 방법
  • ASP.NET Core 애플리케이션의 성능을 개선하는 방법
  • RestSharp를 사용하여 ASP.NET Core Web API를 사용하는 방법
  • ASP.NET Core에서 로깅 작업 방법
  • ASP.NET Core에서 MediatR을 사용하는 방법
  • ASP.NET Core에서 세션 상태로 작업하는 방법
  • ASP.NET Core에서 Nancy를 사용하는 방법
  • ASP.NET Web API의 매개 변수 바인딩 이해
  • ASP.NET Core MVC에서 파일을 업로드하는 방법
  • ASP.NET Core Web API에서 전역 예외 처리를 구현하는 방법
  • ASP.NET Core에서 상태 확인을 구현하는 방법
  • ASP.NET 캐싱의 모범 사례
  • .NET에서 Apache Kafka 메시징을 사용하는 방법
  • 웹 API에서 CORS를 활성화하는 방법
  • WebClient 대 HttpClient 대 HttpWebRequest를 사용하는 경우
  • .NET에서 Redis Cache로 작업하는 방법
  • .NET에서 Task.WaitAll 대 Task.WhenAll을 사용하는 경우