연습: 사용자 지정 HTTP 모듈 만들기 및 등록

업데이트: 2007년 11월

이 연습에서는 사용자 지정 HTTP 모듈의 기본 기능을 설명합니다. HTTP 모듈은 모든 요청에서 BeginRequestEndRequest 이벤트에 대한 응답으로 호출됩니다. 따라서 이 모듈은 요청이 처리되기 전과 후에 실행됩니다.

ASP.NET 응용 프로그램이 IIS 6.0에서 실행되는 경우 ASP.NET에서 제공하는 리소스에 대한 요청을 HTTP 모듈을 사용하여 사용자 지정할 수 있습니다. 이러한 리소스에는 ASP.NET 웹 페이지(.aspx 파일), 웹 서비스(.asmx 파일), ASP.NET 처리기(.ashx 파일), ASP.NET에 매핑한 파일 형식 등이 포함됩니다. ASP.NET 응용 프로그램이 IIS 7.0에서 실행되는 경우에는 IIS에서 제공하는 리소스에 대한 요청을 HTTP 모듈을 사용하여 사용자 지정할 수 있습니다. 여기에는 ASP.NET 리소스뿐 아니라 HTML 파일(.htm 또는 .html 파일), 그래픽 파일 등도 포함됩니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요IIS 7.0의 ASP.NET 응용 프로그램 수명 주기 개요를 참조하십시오.

이 항목의 예제 모듈에서는 HTTP 요청이 시작될 때 요청된 ASP.NET 웹 페이지에 메시지를 추가합니다. 그리고 페이지가 처리된 후에 다른 메시지를 추가합니다. 이 모듈에는 다른 파일 형식에 대한 요청에 텍스트를 추가하지 않는지 확인하는 코드가 포함됩니다.

각 이벤트 처리기는 해당 모듈의 전용 메서드로 작성됩니다. 등록된 이벤트가 발생되면 ASP.NET은 모듈에서 ASP.NET 웹 페이지에 정보를 기록하는 적절한 처리기 메서드를 호출합니다.

이 연습에서 수행할 작업은 다음과 같습니다.

  • HTTP 모듈의 코드를 만드는 방법

  • Web.config 파일에 모듈을 등록하는 방법

사전 요구 사항

이 연습을 완료하려면 다음과 같은 요건을 갖추어야 합니다.

  • Visual Studio 또는 Visual Web Developer

또한 이 연습에서는 IIS 6.0 또는 IIS 7.0을 사용하는 것으로 가정합니다. 그러나 ASP.NET Development Server를 사용하는 경우에도 모듈의 기능을 확인할 수 있습니다.

사용자 지정 HTTP 모듈 클래스 만들기

먼저 모듈을 구현하는 클래스 파일을 만듭니다.

사용자 지정 HTTP 모듈 클래스를 만들려면

  1. ASP.NET 웹 사이트를 만들고 이름을 Handler로 지정합니다.

    참고:

    웹 사이트 이름은 원하는 대로 아무 이름이나 선택할 수 있습니다.

  2. 웹 사이트에 App_Code 폴더가 없는 경우 사이트의 루트에 해당 폴더를 만듭니다.

  3. App_Code 디렉터리에서 HelloWorldModule.vb(Visual Basic의 경우) 또는 HelloWorldModule.cs(C#의 경우)라는 클래스 파일을 만듭니다.

    참고:

    또는 Visual Web Developer Express Edition이 아니라 Visual Studio를 사용하는 경우 HelloWorldModule을 클래스 라이브러리 프로젝트로 만들고 컴파일한 다음 결과 어셈블리를 웹 응용 프로그램의 Bin 디렉터리에 저장할 수도 있습니다.

  4. 다음 코드를 클래스 파일에 추가합니다.

    Imports Microsoft.VisualBasic
    Imports System.Web
    
    Public Class HelloWorldModule
        Implements IHttpModule
    
        Public Sub New()
        End Sub
    
        Public ReadOnly Property ModuleName() As String
            Get
                Return "HelloWorldModule"
            End Get
        End Property
    
        ' In the Init function, register for HttpApplication 
        ' events by adding your handlers. 
        Public Sub Init(ByVal application As HttpApplication) _
                Implements IHttpModule.Init
            AddHandler application.BeginRequest, _
                AddressOf Me.Application_BeginRequest
            AddHandler application.EndRequest, _
                AddressOf Me.Application_EndRequest
        End Sub
    
        Private Sub Application_BeginRequest(ByVal source As Object, _
                 ByVal e As EventArgs)
            ' Create HttpApplication and HttpContext objects to access 
            ' request and response properties. 
            Dim application As HttpApplication = DirectCast(source, _
                HttpApplication)
            Dim context As HttpContext = application.Context
            Dim filePath As String = context.Request.FilePath
            Dim fileExtension As String = _
                VirtualPathUtility.GetExtension(filePath)
            If fileExtension.Equals(".aspx") Then
                context.Response.Write("<h1><font color=red>" & _
                    "HelloWorldModule: Beginning of Request" & _
                    "</font></h1><hr>")
            End If
        End Sub
    
        Private Sub Application_EndRequest(ByVal source As Object, _
            ByVal e As EventArgs)
            Dim application As HttpApplication = DirectCast(source, _
                HttpApplication)
            Dim context As HttpContext = application.Context
            Dim filePath As String = context.Request.FilePath
            Dim fileExtension As String = _
                VirtualPathUtility.GetExtension(filePath)
            If fileExtension.Equals(".aspx") Then
                context.Response.Write("<hr><h1><font color=red>" & _
                    "HelloWorldModule: End of Request</font></h1>")
            End If
        End Sub
    
        Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
        End Sub
    
    End Class
    
    using System;
    using System.Web;
    public class HelloWorldModule : IHttpModule
    {
        public HelloWorldModule()
        {
        }
    
        public String ModuleName
        {
            get { return "HelloWorldModule"; }
        }
    
        // In the Init function, register for HttpApplication 
        // events by adding your handlers.
        public void Init(HttpApplication application)
        {
            application.BeginRequest += 
                (new EventHandler(this.Application_BeginRequest));
            application.EndRequest += 
                (new EventHandler(this.Application_EndRequest));
        }
    
        private void Application_BeginRequest(Object source, 
             EventArgs e)
        {
        // Create HttpApplication and HttpContext objects to access
        // request and response properties.
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension = 
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".aspx"))
            {
                context.Response.Write("<h1><font color=red>" +
                    "HelloWorldModule: Beginning of Request" +
                    "</font></h1><hr>");
            }
        }
    
        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension = 
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".aspx"))
            {
                context.Response.Write("<hr><h1><font color=red>" +
                    "HelloWorldModule: End of Request</font></h1>");
            }
        }
    
        public void Dispose() { }
    }
    
  5. 클래스 파일을 저장하고 닫습니다.

  6. 빌드 메뉴에서 웹 사이트 빌드를 클릭합니다.

    웹 사이트가 빌드되지 않으면 문제를 수정합니다. 사용자 지정 HTTP 모듈을 컴파일하지 않으면 등록할 수 없습니다.

IIS 6.0 및 IIS 7.0 기본 모드에서 HTTP 모듈 등록

HelloWorldModule 클래스를 만든 후에는 Web.config 파일에서 항목을 만들어 모듈을 등록합니다. HTTP 모듈을 등록하면 모듈에서 요청 파이프라인 알림을 구독할 수 있습니다.

IIS 7.0에서 응용 프로그램은 기본 또는 통합 모드로 실행될 수 있습니다. 기본 모드에서는 요청이 IIS 6.0에서와 거의 같은 방법으로 처리됩니다. 통합 모드에서는 IIS 7.0이 요청, 모듈 및 기타 기능을 ASP.NET과 함께 공유할 수 있도록 하는 파이프라인을 사용하여 요청을 관리합니다.

모듈을 등록하는 절차는 IIS 7.0 기본 모드와 IIS 7.0 통합 모드에서 서로 다릅니다. 이 단원에서는 IIS 6.0 및 IIS 7.0 기본 모드에 대한 절차를 설명합니다. IIS 7.0 통합 모드에서 실행되는 모듈을 등록하는 절차에 대해서는 다음 단원에 설명되어 있습니다.

기본 모드에서 실행되는 IIS 7.0 및 IIS 6.0에서 모듈을 등록하려면

  1. 웹 사이트에 Web.config 파일이 없는 경우 사이트의 루트에 해당 파일을 만듭니다.

  2. 아래에 강조 표시된 코드를 Web.config 파일에 추가합니다.

    <configuration>
      <system.web>
        <httpModules>      <add name="HelloWorldModule" type="HelloWorldModule"/>     </httpModules>
      </system.web>
    </configuration>
    

    이 코드는 클래스 이름과 모듈 이름이 HelloWorldModule인 모듈을 등록합니다.

통합 모드의 IIS 7.0에서 HTTP 모듈 등록

IIS 7.0 통합 모드에서 모듈을 등록하는 프로세스는 IIS 7.0 기본 모드의 프로세스와 약간 다릅니다.

통합 모드로 실행되는 IIS 7.0에서 모듈을 등록하려면

  1. 웹 사이트에 Web.config 파일이 없는 경우 사이트의 루트에 해당 파일을 만듭니다.

  2. 아래에 강조 표시된 코드를 Web.config 파일에 추가합니다.

    <configuration>
      <system.webServer>    <modules>      <add name="HelloWorldModule" type="HelloWorldModule"/>    </modules>  </system.webServer>
    </configuration>
    
    참고:

    IIS 관리자를 사용하여 모듈을 등록할 수도 있습니다. 자세한 내용은 Configuring Modules in IIS 7.0을 참조하십시오.

    이 코드는 클래스 이름과 모듈 이름이 HelloWorldModule인 모듈을 등록합니다.

사용자 지정 HTTP 모듈 테스트

사용자 지정 HTTP 모듈을 만들고 등록한 후에는 해당 모듈을 테스트할 수 있습니다.

사용자 지정 HTTP 모듈을 테스트하려면

  1. 응용 프로그램에서 새 ASP.NET 페이지를 추가합니다.

  2. 방금 추가한 페이지를 마우스 오른쪽 단추로 클릭하고 브라우저에서 보기를 선택합니다.

    HTTP 모듈은 응답의 시작 및 끝 부분에 문자열을 추가합니다. 이 모듈은 ASP.NET에 할당된 확장명을 사용하는 파일이 요청되면 자동으로 실행됩니다. 자세한 내용은 HTTP 처리기 및 HTTP 모듈 개요를 참조하십시오.

참고 항목

개념

IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요