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

업데이트: 2007년 11월

이 항목에서는 중요한 수명 주기 이벤트를 보여 주고 응용 프로그램 수명 주기에 적합한 코드를 작성하는 방법을 설명하는 등 ASP.NET 응용 프로그램 수명 주기에 대해 간략하게 설명합니다. 이 항목의 정보는 IIS 5.0 및 IIS 6.0에 적용됩니다. IIS 7.0의 ASP.NET 응용 프로그램 수명 주기에 대한 자세한 내용은 IIS 7.0의 ASP.NET 응용 프로그램 수명 주기 개요를 참조하십시오.

ASP.NET 내에서 ASP.NET 응용 프로그램을 초기화하고 요청을 처리하려면 몇 가지 처리 단계를 수행해야 합니다. 또한 ASP.NET은 브라우저의 요청을 처리하는 웹 서버 아키텍처의 일부일 뿐입니다. 원하는 결과를 얻기 위해 적절한 수명 주기 단계에서 코드를 작성할 수 있도록 응용 프로그램 수명 주기를 이해해야 합니다.

일반적인 응용 프로그램 수명 주기

다음 표에서는 ASP.NET 응용 프로그램 수명 주기의 단계에 대해 설명합니다.

단계

설명

사용자가 웹 서버에서 응용 프로그램 리소스를 요청합니다.

브라우저에서 웹 서버(ASP.NET 응용 프로그램의 경우에는 대개 IIS)에 요청을 보내면 ASP.NET 응용 프로그램의 수명 주기가 시작됩니다. ASP.NET은 웹 서버에서 ISAPI 확장입니다. 웹 서버에서는 요청을 받으면 요청된 파일의 파일 이름 확장명을 검사하고 요청을 처리할 ISAPI 확장을 결정한 다음 해당 ISAPI 확장에 요청을 전달합니다. ASP.NET에서는 .aspx, .ascx, .ashx, .asmx 등의 매핑된 파일 이름 확장명을 처리합니다.

참고:
파일 이름 확장명이 ASP.NET에 매핑되어 있지 않으면 ASP.NET에서 요청을 받을 수 없습니다. ASP.NET 인증을 사용하는 응용 프로그램의 경우 이 점을 염두에 두어야 합니다. 예를 들어 .htm 파일은 일반적으로 ASP.NET에 매핑되지 않으므로 ASP.NET에서 .htm 파일 요청에 대해 인증 또는 권한 부여 검사를 수행하지 않습니다. 따라서 파일에 정적 콘텐츠만 포함되어 있더라도 ASP.NET에서 인증 검사를 수행하게 하려면 ASP.NET에 매핑된 파일 이름 확장명(예: .aspx)을 사용하여 파일을 만드십시오.
참고:
특정 파일 이름 확장명을 처리하는 사용자 지정 처리기를 만들 경우에는 IIS에서 ASP.NET에 확장명을 매핑하고 응용 프로그램의 Web.config 파일에서 처리기를 등록해야 합니다. 자세한 내용은 HTTP 처리기 및 HTTP 모듈 개요를 참조하십시오.

ASP.NET에서 응용 프로그램에 대한 첫 번째 요청을 받습니다.

ASP.NET에서 응용 프로그램 리소스에 대한 첫 번째 요청을 받으면 ApplicationManager라는 클래스에서 응용 프로그램 도메인을 만듭니다. 응용 프로그램 도메인을 사용하면 전역 변수에 대해 각 응용 프로그램을 격리시켜 개별적으로 언로드할 수 있습니다. 응용 프로그램 도메인 내에서는 HostingEnvironment라는 클래스 인스턴스가 만들어집니다. 이를 통해 응용 프로그램이 저장되어 있는 폴더의 이름 등과 같은 응용 프로그램 정보에 액세스할 수 있습니다.

다음 다이어그램에서는 이 관계를 보여 줍니다.

또한 ASP.NET에서는 필요한 경우 App_Code 폴더의 응용 프로그램 코드를 포함하여 응용 프로그램의 최상위 항목을 컴파일합니다. 자세한 내용은 이 항목의 뒷부분에서 "컴파일 주기"를 참조하십시오.

각 요청에 대해 ASP.NET 핵심 개체가 만들어집니다.

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

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

모든 핵심 응용 프로그램 개체가 초기화된 후 HttpApplication 클래스의 인스턴스를 만들어 응용 프로그램이 시작됩니다. 응용 프로그램에 Global.asax 파일이 있는 경우 ASP.NET에서는 HttpApplication 클래스에서 파생되는 Global.asax 클래스의 인스턴스를 만들고 이 파생 클래스를 사용하여 응용 프로그램을 나타냅니다.

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

HttpApplication의 인스턴스가 만들어지면 구성된 모듈도 만들어집니다. 예를 들어 이런 식으로 응용 프로그램이 구성되어 있으면 ASP.NET에서는 SessionStateModule 모듈을 만듭니다. 구성된 모든 모듈을 만든 후에는 HttpApplication 클래스의 Init 메서드가 호출됩니다.

다음 다이어그램에서는 이 관계를 보여 줍니다.

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

요청이 처리되는 동안 HttpApplication 클래스에서 다음과 같은 이벤트를 실행합니다. 이러한 이벤트는 개발자가 HttpApplication 클래스를 확장하려는 경우에 특히 중요합니다.

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

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

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

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

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

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

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

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

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

  10. 요청된 리소스의 파일 이름 확장명에 따라(응용 프로그램의 구성 파일에서 매핑됨) 요청을 처리할 IHttpHandler를 구현하는 클래스를 선택합니다. Page 클래스에서 파생된 개체(페이지)에 대한 요청이고 이 페이지를 컴파일해야 할 경우에는 ASP.NET에서 인스턴스를 만들기 전에 페이지를 컴파일합니다.

  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. EndRequest 이벤트를 발생시킵니다.

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

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

수명 주기 이벤트 및 Global.asax 파일

응용 프로그램 실행 주기가 진행되는 동안 응용 프로그램에서는 사용자가 처리할 수 있는 이벤트가 발생하고 재정의할 수 있는 특정 메서드가 호출됩니다. 응용 프로그램 이벤트 또는 메서드를 처리하기 위해 응용 프로그램의 루트 디렉터리에 Global.asax라는 파일을 만들 수 있습니다.

Global.asax 파일을 만드는 경우 ASP.NET에서는 이 파일을 HttpApplication 클래스에서 파생된 클래스로 컴파일한 다음 파생 클래스를 사용하여 응용 프로그램을 나타냅니다.

HttpApplication의 인스턴스는 한 번에 하나의 요청만 처리합니다. 이렇게 하면 응용 프로그램 클래스의 비정적 멤버에 액세스할 때 멤버를 잠글 필요가 없으므로 응용 프로그램 이벤트 처리 과정이 간단해집니다. 또한 요청 관련 데이터를 응용 프로그램 클래스의 비정적 멤버에 저장할 수도 있습니다. 예를 들어 Global.asax 파일에서 속성을 정의한 다음 요청 관련 값을 할당할 수 있습니다.

ASP.NET에서는 Application_BeginRequest와 같은 명명 규칙 Application_event를 사용하여 Global.asax 파일에서 자동으로 응용 프로그램 이벤트를 처리기에 바인딩합니다. 이것은 ASP.NET 페이지 메서드가 페이지의 Page_Load 같은 이벤트에 자동으로 바인딩되는 방식과 비슷합니다. 자세한 내용은 ASP.NET 페이지 수명 주기 개요를 참조하십시오.

Application_Start 및 Application_End 메서드는 HttpApplication 이벤트를 나타내지 않는 특수 메서드입니다. ASP.NET에서는 각 HttpApplication 인스턴스에 대해서가 아니라 응용 프로그램 도메인의 실행 주기 동안 이러한 메서드를 한 번만 호출합니다.

다음 표에서는 응용 프로그램 수명 주기 동안 사용되는 일부 이벤트와 메서드를 보여 줍니다. 이 표에 제공된 것보다 훨씬 많은 이벤트가 있지만 일반적으로 사용되지 않습니다.

이벤트 또는 메서드

설명

Application_Start

ASP.NET 응용 프로그램의 리소스(예: 페이지)가 처음으로 요청되면 호출됩니다. Application_Start 메서드는 응용 프로그램 수명 주기 동안 한 번만 호출됩니다. 이 메서드를 사용하면 데이터를 캐시에 로드하고 정적 값을 초기화하는 등 시작 작업을 수행할 수 있습니다.

응용 프로그램을 시작하는 동안에는 정적 데이터만 설정해야 합니다. 인스턴스 데이터는 HttpApplication 클래스의 첫 번째 인스턴스에서만 사용할 수 있으므로 설정하지 마십시오.

Application_event

이 항목의 앞부분에 나오는 응용 프로그램 수명 주기 표에 있는 것처럼 응용 프로그램 수명 주기에서 적절한 시점에 발생합니다.

Application_Error는 응용 프로그램 수명 주기의 모든 단계에서 발생할 수 있습니다.

요청은 단락(short-circuit)될 수 있으므로 모든 요청에서 항상 발생하는 유일한 이벤트는 Application_EndRequest입니다. 예를 들어 두 개의 모듈에서 Application_BeginRequest 이벤트를 처리하는 경우 첫 번째 모듈에서 예외를 throw하면 두 번째 모듈에 대해 Application_BeginRequest 이벤트가 호출되지 않습니다. 그러나 응용 프로그램에서 리소스를 정리할 수 있도록 Application_EndRequest 메서드가 항상 호출됩니다.

Init

모든 모듈이 만들어진 후에 HttpApplication 클래스의 모든 인스턴스에 대해 한 번 호출됩니다.

Dispose

응용 프로그램 인스턴스가 소멸되기 전에 호출됩니다. 이 메서드를 사용하면 관리되지 않는 리소스를 수동으로 해제할 수 있습니다. 자세한 내용은 관리되지 않는 리소스 정리를 참조하십시오.

Application_End

응용 프로그램 실행 주기에서 응용 프로그램이 언로드되기 전에 한 번 호출됩니다.

컴파일 주기

응용 프로그램에 대한 최초 요청이 이루어지면 ASP.NET에서 응용 프로그램 항목을 특정 순서로 컴파일합니다. 첫 번째로 컴파일되는 항목을 최상위 항목이라고 합니다. 최초 요청 이후 최상위 항목은 종속성이 변경될 때만 다시 컴파일됩니다. 다음 표에서는 ASP.NET 최상위 항목이 컴파일되는 순서를 보여 줍니다.

항목

설명

App_GlobalResources

응용 프로그램의 전역 리소스가 컴파일되고 리소스 어셈블리가 빌드됩니다. 응용 프로그램의 Bin 폴더에 있는 모든 어셈블리가 리소스 어셈블리에 연결됩니다.

App_WebResources

웹 서비스의 프록시 형식이 생성되고 컴파일됩니다. 그 결과로 생성되는 웹 참조 어셈블리는 리소스 어셈블리에 연결됩니다.

Web.config 파일에 정의된 프로필 속성

응용 프로그램의 Web.config 파일에 프로필 속성이 정의되어 있는 경우 프로필 개체를 포함하는 어셈블리가 생성됩니다.

App_Code

소스 코드 파일이 빌드되고 하나 이상의 어셈블리가 생성됩니다. 코드 어셈블리 및 프로필 어셈블리는 모두 리소스 및 웹 참조 어셈블리에 연결됩니다.

Global.asax

응용 프로그램 개체가 컴파일되고 앞서 생성된 모든 어셈블리에 연결됩니다.

응용 프로그램의 최상위 항목이 컴파일되면 ASP.NET에서는 필요에 따라 폴더, 페이지 및 기타 항목을 컴파일합니다. 다음 표에서는 ASP.NET 폴더 및 항목이 컴파일되는 순서를 보여 줍니다.

항목

설명

App_LocalResources

요청된 항목을 포함하는 폴더에 App_LocalResources 폴더가 들어 있는 경우 로컬 리소스 폴더의 내용이 컴파일되고 전역 리소스 어셈블리에 연결됩니다.

개별 웹 페이지(.aspx 파일), 사용자 정의 컨트롤(.ascx 파일), HTTP 처리기(.ashx 파일) 및 HTTP 모듈(.asmx 파일)

필요에 따라 컴파일되고 로컬 리소스 어셈블리 및 최상위 어셈블리에 연결됩니다.

테마, 마스터 페이지, 기타 리소스 파일

페이지에서 참조하는 개별 테마의 스킨 파일, 마스터 페이지 및 기타 소스 코드 파일은 참조하는 페이지가 컴파일된 다음 컴파일됩니다.

컴파일된 어셈블리는 서버에 캐시되어 이후 요청에서 다시 사용되고, 소스 코드가 변경되지 않는 한 응용 프로그램을 다시 시작하더라도 보존됩니다.

최초 요청 시 응용 프로그램이 컴파일되므로 응용 프로그램을 처음 호출할 때 이후 요청에 비해 상당한 시간이 걸릴 수 있습니다. 응용 프로그램을 미리 컴파일하면 최초 요청에 필요한 시간을 줄일 수 있습니다. 자세한 내용은 방법: ASP.NET 웹 사이트 미리 컴파일을 참조하십시오.

응용 프로그램 다시 시작

웹 응용 프로그램의 소스 코드를 수정하면 ASP.NET에서 소스 파일을 어셈블리로 다시 컴파일합니다. 응용 프로그램의 최상위 항목을 수정하면 응용 프로그램에서 이 최상위 어셈블리를 참조하는 모든 기타 어셈블리도 다시 컴파일됩니다.

또한 응용 프로그램의 알려진 폴더에서 특정 형식의 파일을 수정, 추가 또는 삭제하면 응용 프로그램이 다시 시작됩니다. 다음과 같은 작업을 수행하면 응용 프로그램이 다시 시작됩니다.

  • 응용 프로그램의 Bin 폴더에서 어셈블리를 추가, 수정 또는 삭제

  • App_GlobalResources 또는 App_LocalResources 폴더에서 지역화 리소스를 추가, 수정 또는 삭제

  • 응용 프로그램의 Global.asax 파일을 추가, 수정 또는 삭제

  • App_Code 디렉터리에서 소스 코드 파일을 추가, 수정 또는 삭제

  • 프로필 구성을 추가, 수정 또는 삭제

  • App_WebReferences 디렉터리에서 웹 서비스 참조를 추가, 수정 또는 삭제

  • 응용 프로그램의 Web.config 파일을 추가, 수정 또는 삭제

응용 프로그램을 다시 시작해야 하는 경우 ASP.NET은 응용 프로그램 도메인을 다시 시작하고 새 어셈블리를 로드하기 전에 기존 응용 프로그램 도메인 및 이전 어셈블리에서 보류 중인 요청을 모두 처리합니다.

HTTP 모듈

IHttpModule 클래스를 통해 ASP.NET 응용 프로그램 수명 주기를 확장할 수 있습니다. ASP.NET에는 SessionStateModule 클래스처럼 IHttpModule을 구현하는 클래스가 여러 개 있습니다. 또한 IHttpModule을 구현하는 클래스를 사용자가 직접 만들 수도 있습니다.

응용 프로그램에 모듈을 추가하는 경우 이러한 모듈 자체에서 이벤트를 발생시킬 수 있습니다. 응용 프로그램에서는 Global.asax 파일에서 modulename_eventname 규칙을 사용하여 이러한 이벤트를 등록할 수 있습니다. 예를 들어 FormsAuthenticationModule 개체에서 발생되는 Authenticate 이벤트를 처리하려면 FormsAuthentication_Authenticate 처리기를 만들 수 있습니다.

SessionStateModule 클래스는 ASP.NET에서 기본적으로 사용할 수 있습니다. 모든 세션 이벤트는 자동으로 Session_Start와 같은 Session_event로 연결됩니다. Start 이벤트는 새 세션이 만들어질 때마다 발생합니다. 자세한 내용은 ASP.NET 세션 상태 개요를 참조하십시오.

참고 항목

개념

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

ASP.NET 개요

ASP.NET 컴파일 개요

기타 리소스

ASP.NET 및 IIS 구성