Share via


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

업데이트: 2007년 11월

이 항목에서는 IIS 7.0에서 통합 모드로 .NET Framework 3.0 이상과 함께 실행되는 ASP.NET 응용 프로그램의 응용 프로그램 수명 주기에 대해 설명합니다. IIS 7.0은 IIS 6.0에서 실행되는 ASP.NET처럼 동작하는 기본 모드도 지원합니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요를 참조하십시오.

IIS 7.0 통합 파이프라인은 네이티브 코드 및 관리 코드 모듈을 모두 지원하는 통합 요청 처리 파이프라인입니다. IHttpModule 인터페이스를 구현하는 관리 코드 모듈은 요청 파이프라인의 모든 이벤트에 액세스할 수 있습니다. 예를 들어 관리 코드 모듈은 ASP.NET 웹 페이지(.aspx 파일) 및 HTML 페이지(.htm 또는 .html 파일) 모두의 ASP.NET 폼 인증에 사용될 수 있습니다. HTML 페이지가 IIS 및 ASP.NET에서 정적 리소스로 취급되는 경우에도 마찬가지입니다. IIS 7.0 통합 모드에 대한 자세한 내용은 ASP.NET Integration with IIS7을 참조하십시오.

이 항목에는 다음과 같은 단원이 포함되어 있습니다.

  • 아키텍처 개요

  • 수명 주기 단계

  • Global.asax 파일 사용

  • IIS 7.0의 관리 코드 모듈

아키텍처 개요

IIS 7.0 통합 모드의 요청은 IIS 6.0에서의 ASP.NET 리소스 요청 단계와 비슷한 단계에 따라 전달됩니다. 그러나 IIS 7.0에서는 이러한 단계에 MapRequestHandler, LogRequestPostLogRequest 이벤트와 같은 여러 개의 추가 응용 프로그램 이벤트가 포함됩니다.

IIS 7.0 및 IIS 6.0의 처리 단계에서의 가장 큰 차이점은 ASP.NET이 IIS 서버와 통합되는 방식에 있습니다. IIS 6.0에는 두 개의 요청 처리 파이프라인이 있습니다. 한 파이프라인은 네이티브 코드 ISAPI 필터 및 확장 구성 요소를 위한 것입니다. 다른 파이프라인은 ASP.NET과 같은 관리 코드 응용 프로그램 구성 요소를 위한 것입니다. IIS 7.0에서는 ASP.NET 런타임이 웹 서버와 통합되므로 모든 요청에 대해 하나의 통합 요청 처리 파이프라인이 있습니다. ASP.NET 개발자에게 해당하는 통합 파이프라인의 이점은 다음과 같습니다.

  • 통합 파이프라인은 HttpApplication 개체에 의해 노출되는 모든 이벤트를 발생시켜서 기존 ASP.NET HTTP 모듈이 IIS 7.0 통합 모드에서 작동하도록 합니다.

  • 네이티브 코드 및 관리 코드 모듈 모두 웹 서버, 웹 사이트 또는 웹 응용 프로그램 수준에서 구성될 수 있습니다. 여기에는 세션 상태, 폼 인증, 프로필 및 역할 관리를 위한 기본 제공 ASP.NET 관리 코드가 포함됩니다. 또한 관리 코드 모듈은 모든 요청에 대해 설정되거나 해제될 수 있습니다. 요청이 .aspx 파일과 같은 ASP.NET 리소스에 대한 것인지의 여부는 관계없습니다.

  • 관리 코드 모듈은 파이프라인의 모든 단계에서 호출될 수 있습니다. 여기에는 요청에 대한 서버 처리가 수행되기 전, 서버 처리가 수행된 후 또는 이 두 시점 사이의 모든 단계가 포함됩니다.

  • 응용 프로그램의 Web.config 파일을 통해 모듈을 등록하고 설정하거나 해제할 수 있습니다.

다음 그림에서는 응용 프로그램 요청 파이프라인의 구성을 보여 줍니다. 예제에는 다음이 포함되어 있습니다.

  • Anonymous 네이티브 코드 모듈 및 Forms 관리 코드 모듈(FormsAuthenticationModule에 해당). 이 모듈이 구성된 다음 요청의 Authentication 단계에서 호출됩니다.

  • Basic 네이티브 코드 모듈 및 Windows 관리 코드 모듈(WindowsAuthenticationModule에 해당). 이 모듈은 표시되지만 응용 프로그램에 대해 구성되지 않습니다.

  • 응답을 생성하기 위해 처리기(URL에 한정된 모듈)가 호출되는 Execute handler 단계. .aspx 파일의 경우에는 PageHandlerFactory 처리기가 요청에 응답하는 데 사용됩니다. 정적 파일의 경우에는 네이티브 코드 StaticFileModule 모듈이 요청에 응답합니다.

  • Trace 네이티브 코드 모듈. 이 모듈은 표시되지만 응용 프로그램에 대해 구성되지 않습니다.

  • Custom module 관리 코드 클래스. Log request 단계에서 호출됩니다.

이전 버전의 IIS에서 IIS 7.0으로 마이그레이션되는 ASP.NET 응용 프로그램의 알려진 호환성 문제에 대한 자세한 내용은 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode에서 "Known Differences Between Integrated Mode and Classic Mode" 단원을 참조하십시오.

수명 주기 단계

다음 표에서는 IIS 7.0에서 통합 모드로 사용될 때의 ASP.NET 응용 프로그램 수명 주기 단계를 보여 줍니다.

단계

설명

응용 프로그램 리소스에 대한 요청이 발생합니다.

브라우저에서 웹 서버에 요청을 보내면 ASP.NET 응용 프로그램의 수명 주기가 시작됩니다.

IIS 7.0의 기본 모드와 IIS 6.0에서는 ASP.NET 요청 파이프라인이 웹 서버 파이프라인과 분리됩니다. 모듈은 ASP.NET ISAPI 확장으로 라우팅되는 요청에만 적용됩니다. 요청된 리소스 형식의 파일 이름 확장명이 ASP.NET에 명시적으로 매핑되지 않으면 요청이 ASP.NET 런타임에 처리되지 않기 때문에 해당 요청에 대해 ASP.NET 기능이 호출되지 않습니다.

IIS 7.0의 통합 모드에서는 통합 파이프라인이 모든 요청을 처리합니다. 통합 파이프라인이 요청을 받을 때 요청은 모든 요청에 대해 공통적으로 사용되는 단계에 따라 전달됩니다. 이 단계는 RequestNotification 열거형으로 표현됩니다. ASP.NET 기능은 요청 파이프라인에 액세스할 수 있는 관리 코드 모듈에 캡슐화되어 있기 때문에 모든 요청이 ASP.NET 기능을 활용하도록 구성될 수 있습니다. 예를 들어 .htm 파일 이름 확장명이 ASP.NET에 명시적으로 매핑되지 않은 경우에도 HTML 페이지에 대한 요청이 ASP.NET 모듈을 호출합니다. 따라서 모든 리소스에 대해 ASP.NET 인증 및 권한 부여를 활용할 수 있습니다.

통합 파이프라인이 응용 프로그램에 대한 첫 번째 요청을 받습니다.

통합 파이프라인이 응용 프로그램에서 리소스에 대한 첫 번째 요청을 받으면 요청이 처리되는 응용 프로그램 도메인에 해당하는 ApplicationManager 클래스가 만들어집니다. 응용 프로그램 도메인은 전역 변수에 대해 응용 프로그램 간 격리를 제공하며 각 응용 프로그램이 따로 언로드되도록 합니다. 응용 프로그램 도메인에서는 HostingEnvironment 클래스의 인스턴스가 만들어집니다. 이를 통해 응용 프로그램이 저장되어 있는 폴더의 이름 등과 같은 응용 프로그램 정보에 액세스할 수 있습니다.

첫 번째 요청 동안, 필요한 경우 응용 프로그램에 있는 최상위 수준의 항목이 컴파일됩니다. 여기에는 App_Code 폴더에 있는 응용 프로그램 코드가 포함됩니다. 이 항목의 뒷부분에 있는 IIS 7.0의 관리 코드 모듈에서 설명한 대로 App_Code 폴더에 사용자 지정 모듈 및 처리기를 포함할 수 있습니다.

각 요청에 대해 응답 개체가 만들어집니다.

응용 프로그램 도메인이 만들어지고 HostingEnvironment 개체가 인스턴스화된 후 HttpContext, HttpRequestHttpResponse 같은 응용 프로그램 개체가 만들어지고 초기화됩니다. HttpContext 클래스에는 현재 응용 프로그램 요청과 관련된 특정 개체(예: HttpRequestHttpResponse 개체)가 포함되어 있습니다. HttpRequest 개체에는 쿠키 및 브라우저 정보와 같은 현재 요청에 대한 정보가 포함되어 있고, HttpResponse 개체에는 렌더링된 모든 출력 및 쿠키와 같은 클라이언트로 보내는 응답이 포함되어 있습니다.

다음은 IIS 6.0 및 .NET Framework 3.0 이상과 함께 통합 모드에서 실행 중인 IIS 7.0과의 몇 가지 주요 차이점을 보여 줍니다.

HttpApplication 개체가 요청에 할당됩니다.

모든 응용 프로그램 개체가 초기화된 후 HttpApplication 클래스의 인스턴스가 만들어져 응용 프로그램이 시작됩니다. 응용 프로그램에 Global.asax 파일이 있으면 ASP.NET이 HttpApplication 클래스에서 파생된 Global.asax 클래스의 인스턴스를 대신 만듭니다. 그런 다음 파생 클래스를 사용하여 응용 프로그램을 나타냅니다.

참고:
응용 프로그램에서 ASP.NET 페이지 또는 프로세스가 처음으로 요청될 때 HttpApplication 클래스의 새 인스턴스가 만들어집니다. 그러나 성능을 최대화하기 위해 HttpApplication 인스턴스를 여러 요청에 대해 다시 사용할 수도 있습니다.

어떤 ASP.NET 모듈이 로드되는지는(예: SessionStateModule) 응용 프로그램이 부모 응용 프로그램으로부터 상속하는 관리 코드 모듈에 따라 달라지며, 응용 프로그램 Web.config 파일의 구성 섹션에 어떤 모듈이 구성되어 있는지에 따라서도 달라집니다. 모듈은 응용 프로그램의 system.webServer 섹션에 있는 Web.config modules 요소에서 추가되거나 제거됩니다. 자세한 내용은 방법: IIS 7.0에 대해 <system.webServer> 섹션 구성을 참조하십시오.

HttpApplication 파이프라인에 의해 요청이 처리됩니다.

다음 작업은 요청이 처리되는 동안 HttpApplication 클래스에 의해 수행됩니다. 이 이벤트는 주요 요청 파이프라인 이벤트가 발생할 때 코드를 실행하려는 페이지 개발자에게 유용합니다. 사용자 지정 모듈을 개발할 때 모든 요청에 대해 모듈이 파이프라인에 호출되도록 하려는 경우에도 유용합니다. 사용자 지정 모듈은 IHttpModule 인터페이스를 구현합니다. IIS 7.0의 통합 모드에서는 모듈의 Init 메서드에 이벤트 처리기를 등록해야 합니다.

  1. 브라우저에서 보낸 정보를 검사하고 악의적인 태그가 포함되어 있는지 확인하여 요청의 유효성을 검사합니다. 자세한 내용은 ValidateRequest스크립트 악용 개요를 참조하십시오.

  2. Web.config 파일의 UrlMappingsSection 섹션에 URL이 구성되어 있으면 URL 매핑을 수행합니다.

  3. BeginRequest 이벤트를 발생시킵니다.

  4. AuthenticateRequest 이벤트를 발생시킵니다.

  5. PostAuthenticateRequest 이벤트를 발생시킵니다.

  6. AuthorizeRequest 이벤트를 발생시킵니다.

  7. PostAuthorizeRequest 이벤트를 발생시킵니다.

  8. ResolveRequestCache 이벤트를 발생시킵니다.

  9. PostResolveRequestCache 이벤트를 발생시킵니다.

  10. MapRequestHandler 이벤트를 발생시킵니다. 요청된 리소스의 파일 이름 확장명을 기준으로 적절한 처리기가 선택됩니다. 처리기는 IIS 7.0StaticFileModule 같은 네이티브 코드 모듈이거나 PageHandlerFactory 클래스(.aspx 파일을 처리함) 같은 관리 코드 모듈일 수 있습니다.

  11. PostMapRequestHandler 이벤트를 발생시킵니다.

  12. AcquireRequestState 이벤트를 발생시킵니다.

  13. PostAcquireRequestState 이벤트를 발생시킵니다.

  14. PreRequestHandlerExecute 이벤트를 발생시킵니다.

  15. 요청에 대해 적절한 IHttpHandler 클래스의 ProcessRequest 메서드 또는 비동기 버전의 IHttpAsyncHandler.BeginProcessRequest를 호출합니다. 예를 들어 페이지에 대한 요청인 경우 현재 페이지 인스턴스에서 요청을 처리합니다.

  16. PostRequestHandlerExecute 이벤트를 발생시킵니다.

  17. ReleaseRequestState 이벤트를 발생시킵니다.

  18. PostReleaseRequestState 이벤트를 발생시킵니다.

  19. Filter 속성이 정의되어 있는 경우 응답 필터링을 수행합니다.

  20. UpdateRequestCache 이벤트를 발생시킵니다.

  21. PostUpdateRequestCache 이벤트를 발생시킵니다.

  22. LogRequest 이벤트를 발생시킵니다.

  23. PostLogRequest 이벤트를 발생시킵니다.

  24. EndRequest 이벤트를 발생시킵니다.

  25. PreSendRequestHeaders 이벤트를 발생시킵니다.

  26. PreSendRequestContent 이벤트를 발생시킵니다.

    참고:
    MapRequestHandler, LogRequestPostLogRequest 이벤트는 응용 프로그램의 IIS 7.0의 통합 모드에서 .NET Framework 3.0 이상과 함께 실행될 경우에만 지원됩니다.

Global.asax 파일 사용

Global.asax 파일은 IIS 6.0의 ASP.NET에서 사용되는 것처럼 IIS 7.0의 통합 모드에서 사용됩니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요의 "수명 주기 이벤트 및 Global.asax 파일" 단원을 참조하십시오.

한 가지 차이점은 MapRequestHandler, LogRequestPostLogRequest 이벤트에 대한 처리기를 추가할 수 있다는 것입니다. 이러한 이벤트는 IIS 7.0의 통합 모드에서 .NET Framework 3.0 이상과 함께 실행되는 응용 프로그램에서 지원됩니다.

Global.asax 파일에서 응용 프로그램 이벤트 처리기를 제공하여 ASP.NET에 의해 처리되는 모든 요청(예: .aspx 및 .axd 페이지에 대한 요청)에 대해 실행되는 코드를 추가할 수 있습니다. 그러나 Global.asax 파일에 있는 처리기 코드는 정적 파일과 같이 ASP.NET이 아닌 리소스의 요청에 대해서는 호출되지 않습니다. 모든 리소스에 대해 실행되는 관리 코드를 실행하려면 IHttpModule 인터페이스를 구현하는 사용자 지정 모듈을 만드십시오. 사용자 지정 모듈은 응용 프로그램의 모든 리소스 요청에 대해 실행됩니다. 리소스 처리기가 ASP.NET 처리기가 아닌 경우에도 마찬가지입니다.

IIS 7.0의 관리 코드 모듈

IIS 7.0에서 구성하고 로드할 수 있는 ASP.NET 관리 코드 모듈에는 다음이 포함됩니다.

IIS 7.0 관리 코드 모듈을 구성하려면 다음 방법 중 하나를 사용합니다.

FormsAuthenticationModule 모듈과 같은 ASP.NET 관리 코드 모듈이 IIS 7.0에 로드되도록 구성된 경우에는 요청 파이프라인에 있는 모든 이벤트에 액세스할 수 있습니다. 즉, 모든 요청이 관리 코드 모듈을 통해 전달됩니다. FormsAuthenticationModule 클래스는 정적 콘텐츠가 ASP.NET 처리기에 의해 처리되지 않는 경우에도 폼 인증을 사용하여 해당 정적 콘텐츠를 보호할 수 있습니다.

사용자 지정 관리 코드 모듈 개발

ASP.NET 응용 프로그램 수명 주기는 IHttpModule 인터페이스를 구현하는 모듈을 사용하여 연장할 수 있습니다. IHttpModule 인터페이스를 구현하는 모듈은 관리 코드 모듈입니다. ASP.NET 및 IIS 7.0의 통합 파이프라인도 네이티브 코드 모듈을 통해 확장될 수 있지만, 이 항목에서는 다루지 않습니다. 네이티브 코드 모듈과 일반적인 모듈 구성 방법에 대한 자세한 내용은 IIS Module Overview를 참조하십시오.

응용 프로그램의 App_Code 폴더에서 관리 코드 모듈을 클래스 파일로 정의할 수 있습니다. 모듈을 클래스 라이브러리 프로젝트로 만들고, 컴파일하고, 응용 프로그램의 Bin 폴더에 추가할 수도 있습니다. 사용자 지정 모듈을 만든 후에는 IIS 7.0을 사용하여 등록해야 합니다. 설명된 방법 중 하나를 사용하여 IIS 7.0 관리 코드 모듈을 관리할 수 있습니다. 예를 들어 응용 프로그램의 Web.config 파일을 편집하여 해당 응용 프로그램에 대해서만 관리 코드 모듈을 등록할 수 있습니다. 모듈 등록 예제는 연습: 사용자 지정 HTTP 모듈 만들기 및 등록을 참조하십시오.

모듈이 응용 프로그램의 App_Code 또는 Bin 폴더에서 정의되고 응용 프로그램의 Web.config 파일에 등록되면 해당 응용 프로그램에 대해서만 호출됩니다. 응용 프로그램의 Web.config 파일에 모듈을 등록하려면 system.webServer 섹션의 modules 요소를 사용하십시오. 자세한 내용은 방법: IIS 7.0에 대해 <system.webServer> 섹션 구성을 참조하십시오. IIS 관리자 또는 Appcmd.exe 도구를 사용하여 변경하면 응용 프로그램의 Web.config 파일이 변경됩니다.

관리 코드 모듈은 IIS 7.0 구성 저장소(ApplicationHost.config 파일)의 modules 요소에 등록될 수도 있습니다. ApplicationHost.config 파일에 등록된 모듈은 IIS 7.0에서 호스팅하는 모든 웹 응용 프로그램에 대해 등록된 것이므로 전역적으로 적용됩니다. 마찬가지로 ApplicationHost.config 파일의 globalModules 요소에서 정의된 네이티브 코드 모듈도 전역적으로 적용됩니다. 웹 응용 프로그램에 전역 모듈이 필요 없는 경우에는 이를 해제할 수 있습니다.

예제

다음 예제에서는 LogRequestPostLogRequest 이벤트를 처리하는 사용자 지정 모듈을 보여 줍니다. 이벤트 처리기는 모듈의 Init 메서드에 등록됩니다.

Imports System
Imports System.Data
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports Microsoft.VisualBasic

' Module that demonstrates one event handler for several events.
Namespace Samples

    Public Class ModuleExample
        Implements IHttpModule

        Public Sub New()
            ' Constructor
        End Sub

        Public Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
            AddHandler app.LogRequest, AddressOf Me.App_Handler
            AddHandler app.PostLogRequest, AddressOf Me.App_Handler
        End Sub

        Public Sub Dispose() Implements IHttpModule.Dispose
        End Sub

        ' One for both the LogRequest and PostLogRequest events.
        Public Sub App_Handler(ByVal source As Object, ByVal e As EventArgs)
            Dim app As HttpApplication = CType(source, HttpApplication)
            Dim context As HttpContext = app.Context

            If (context.CurrentNotification = RequestNotification.LogRequest) Then

                If Not (context.IsPostNotification) Then

                    ' Put code here that is invoked when the LogRequest event is raised.

                Else
                    ' PostLogRequest
                    ' Put code here that runs after the LogRequest event completes.

                End If
            End If
        End Sub
    End Class

End Namespace
using System;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;

// Module that demonstrates one event handler for several events.
namespace Samples
{
    public class ModuleExample : IHttpModule
    {
        public ModuleExample()
        {
            // Constructor
        }
        public void Init(HttpApplication app)
        {
            app.LogRequest += new EventHandler(App_Handler);
            app.PostLogRequest += new EventHandler(App_Handler);
        }
        public void Dispose()
        {
        }
        // One handler for both the LogRequest and the PostLogRequest events.
        public void App_Handler(object source, EventArgs e)
        {
            HttpApplication app = (HttpApplication)source;
            HttpContext context = app.Context;

            if (context.CurrentNotification == RequestNotification.LogRequest)
            {
                if (!context.IsPostNotification)
                {
                    // Put code here that is invoked when the LogRequest event is raised.
                }
                else
                {
                    // PostLogRequest
                    // Put code here that runs after the LogRequest event completes.
                }
            }

        }
    }
}

다음 예제에서는 응용 프로그램의 Web.config 파일에 모듈을 등록하는 방법을 보여 줍니다. configuration 섹션 안에 system.webServer 구성 섹션을 추가합니다.

<system.webServer>
  <modules>
    <add name="ModuleExample" type="Samples.ModuleExample"/>
  </modules>
</system.webServer>

사용자 지정 모듈을 만들고 등록하는 방법을 보여 주는 추가 예제는 연습: 사용자 지정 HTTP 모듈 만들기 및 등록을 참조하십시오.

참고 항목

개념

ASP.NET 페이지 수명 주기 개요

ASP.NET 개요

ASP.NET 컴파일 개요

기타 리소스

ASP.NET 및 IIS 구성