8.2 ASP.NET 파이프라인 및 애플리케이션 수명 주기
8.1절에서는 IIS의 시스템 아키텍처와 HTTP 요청 처리의 전체 프로세스를 소개합니다. 이를 통해 각 ASP.NET 웹 사이트는 HTTP 요청에 응답하고 사용자에게 필요한 정보를 제공할 수 있는 웹 응용 프로그램에 해당한다는 것을 알 수 있습니다. 그렇다면 ASP.NET 응용 프로그램은 HTTP 요청에 정확히 어떻게 응답합니까? 어떤 구체적인 처리 절차가 포함되어 있나요? 여기에는 ASP.NET 응용 프로그램의 수명 주기가 포함됩니다.
8.2.1 ASP.NET 애플리케이션 수명 주기*
이 섹션에서는 IIS 6을 예로 들어 ASP.NET 응용 프로그램에서 HTTP 요청을 처리하는 프로세스를 단계별로 소개합니다. IIS 7의 프로세스는 IIS 6과 비교하여 약간의 변경 사항이 있지만 일반적으로 일관성이 있습니다.
1 브라우저는 ASP.NET 웹 페이지에 액세스하기 위해 HTTP 요청을 보냅니다.
이 요청이 이 웹 페이지가 속한 ASP.NET 응용 프로그램에 대한 첫 번째 요청이라고 가정합니다.
이 요청이 웹 서버에 도달하면 HTTP.SYS는 이 요청의 URL에 따라 이를 ASP.NET 응용 프로그램에 해당하는 응용 프로그램 풀과 이 응용 프로그램에서 실행되는 응용 프로그램 풀에 전달합니다. 풀 작업자 프로세스는 요청 처리를 담당합니다[1].
작업자 프로세스는 이 요청을 받은 후 ASP.NET 페이지 처리 전용 ISAPI 확장 "aspnet_isapi.dll"을 로드하고 HTTP 요청을 전달합니다.
작업자 프로세스가 aspnet_isapi.dll을 로드한 후 aspnet_isapi.dll은 ASP.NET 응용 프로그램(CLR[2])의 실행 환경을 로드하는 일을 담당합니다.
작업자 프로세스는 관리되지 않는 환경(Windows 운영 체제 자체 참조)에서 작동하는 반면, .NET의 개체는 관리되는 환경(CLR 참조)에서 작동합니다. 관리되지 않는 환경에서 수신된 요청은 처리를 위해 해당 .NET 개체(관리되는 환경에서)로 전달됩니다.
2 ApplicationManager 객체와 애플리케이션 도메인을 생성합니다.
CLR이 로드된 후 ApplicationManager 클래스는 애플리케이션 도메인 생성을 담당합니다. 각 ASP.NET 응용 프로그램은 자체 응용 프로그램 도메인에서 실행되며 고유한 응용 프로그램 식별자로 식별됩니다.
각 응용 프로그램 도메인은 도메인에서 실행되는 ASP.NET 응용 프로그램 관리(예: ASP.NET 응용 프로그램 시작 및 중지, 지정된 ASP.NET 응용 프로그램 개체 생성 등)를 담당하는 ApplicationManager 클래스의 인스턴스에 해당합니다. .
3 HostingEnvironment 객체 생성
ASP.NET 애플리케이션에 대한 애플리케이션 도메인을 만들 때 ASP.NET 애플리케이션에 대한 일부 관리 정보(예: ASP.NET 애플리케이션의 ID, 해당 가상 디렉터리 및 실제 디렉터리)를 제공하는 HostingEnvironment 개체가 생성됩니다. 그리고 일부 추가 기능(예: 응용 프로그램 도메인에 개체 등록, 특정 사용자 가장 등)을 제공합니다.
4 각 요청에 대해 ASP.NET Core 개체 만들기
응용 프로그램 도메인이 생성되면 ISAPIRuntime 개체가 생성되고 해당 ProcessRequest() 메서드가 자동으로 호출됩니다. 이 메서드에서 ISAPIRuntime 개체는 들어오는 HTTP 요청을 기반으로 HttpWorkerRequest 개체를 생성합니다. 이 개체는 HTTP 요청의 다양한 정보를 개체 지향 방식으로 래핑합니다(즉, 원래 HTTP 요청 정보는 HttpWorkerRequest 개체로 캡슐화됩니다). 그런 다음 ISAPIRuntime 개체의 StartProcessing() 메서드를 호출하여 전체 HTTP 요청 처리 프로세스("HTTP 파이프라인: HTTP 파이프라인")를 시작합니다. 이 처리 프로세스가 시작되면 HttpRuntime 유형 개체가 생성되고 이전에 생성된 HttpWorkerRequest 개체가 메서드 매개 변수로 사용되며 이 HttpRuntime 개체의 ProcessRequest() 메서드에 전달됩니다.
몇 가지 매우 중요한 작업은 HttpRuntime 클래스의 ProcessRequest() 메서드에서 수행되며, 그 중 웹 소프트웨어 엔지니어와 가장 밀접하게 관련된 작업은 다음과 같습니다.
HttpRuntime 클래스의 ProcessRequest() 메서드는 HttpWorkerRequest 개체에 제공된 HTTP 요청 정보를 기반으로 HttpContext 개체를 생성합니다.
HttpContext 개체에는 ASP.NET 프로그래밍에서 매우 일반적인 두 가지 개체인 HttpResponse와 HttpRequest가 포함되어 있으므로 중요합니다.
HttpRequest 객체의 정보는 원래 HTTP 요청에서 나옵니다. 예를 들어 Url 속성은 원래 HTTP 요청 정보의 URL을 나타냅니다.
HttpResponse 개체에는 브라우저에 반환할 정보를 생성하기 위한 몇 가지 속성과 메서드가 있습니다.
Page 클래스는 이 두 개체를 참조하는 해당 속성을 제공하므로 "Requset" 및 "Response" 속성을 직접 사용하여 ASP.NET 웹 페이지에서 이 두 개체에 액세스할 수 있습니다. 예를 들어:
공개 부분 클래스 _Default : System.Web.UI.Page
{
protected void Page_Load(개체 전송자, EventArgs e)
{
응답 .Write(요청 .Url);
}
}
Page 클래스의 Context 속성은 HttpContext 개체를 참조하므로 위 코드를 다음 형식으로 다시 작성할 수도 있습니다.
공개 부분 클래스 _Default : System.Web.UI.Page
{
protected void Page_Load(개체 전송자, EventArgs e)
{
this.Context.Response .Write(this.Context.Request .Url);
}
}
세 가지 개체인 HttpContext, HttpResponse 및 HttpRequest와 관련하여 다음 사항을 숙지해야 합니다.
l HttpContext 객체에는 HttpResponse와 HttpRequest라는 두 가지 객체가 포함되어 있습니다. HttpRequest 객체에서 HTTP 요청 관련 정보를 얻을 수 있으며, HttpResponse 메서드를 호출하여 브라우저에 출력할 내용을 얻을 수 있습니다.
l 각 HTTP 요청에 대해 ASP.NET은 전체 HTTP 처리 중에 액세스할 수 있는 HttpContext 개체를 만듭니다.
5 요청을 처리하기 위해 HttpApplication 개체를 할당합니다.
HttpContext 개체를 생성하는 것 외에도 HttpRuntime 클래스의 ProcessRequest() 메서드는 또 다른 매우 중요한 작업을 완료합니다. 즉, 전체 HTTP 요청 처리의 각 단계를 관리하기 위해 HttpApplicationFactory 클래스[3]의 인스턴스에 HttpApplication 개체를 할당하는 작업을 수행합니다. 파이프라인. 일종의 이벤트입니다.
HttpApplicationFactory 개체는 HttpApplication 개체 풀을 관리합니다[4]. HTTP 요청이 오면 풀에 사용 가능한 HttpApplication 개체가 있으면 이 개체가 HTTP 요청을 처리하기 위해 직접 할당됩니다. 생성되었습니다.
6 HttpApplication 개체는 HTTP 파이프라인을 시작합니다.
HttpApplication 개체는 전체 "HTTP 요청 처리 파이프라인(HTTP 파이프라인)"을 조립하는 역할을 담당합니다. "HTTP 요청 처리 파이프라인"은 현대 공장의 "프로덕션 파이프라인"에 비교할 수 있습니다. 이전 단계에서 생성된 HttpContext 개체는 이 프로덕션 파이프라인에서 처리할 "제품"입니다. "프로덕션 파이프라인"의 다른 부분을 통해 흐를 때 구체적으로 처리되고 처리됩니다.
이러한 구체적인 "과정 및 치료"는 어떻게 진행됩니까?
간단히 말해서, HttpContext 개체가 "프로덕션 파이프라인"의 다른 부분을 통과할 때 HttpApplication 개체는 일련의 이벤트를 트리거합니다[5]. 특정 구성 요소 - HTTP 모듈(HTTP 모듈)은 이러한 이벤트에 응답할 수 있습니다. 이 이벤트 응답 코드에서 HttpContext 개체는 "처리 및 처리"될 수 있습니다. 이러한 의미에서 HTTP 모듈은 "프로덕션 파이프라인"으로 간주될 수 있습니다. ” 노동자들. HTTP 모듈은 실제로 앞서 소개된 "ISAPI 필터"입니다.
HTTP 모듈 객체는 HttpApplication 객체의 InitModules() 메소드[6]에서 생성됩니다. 우리는 일반적으로 HttpApplication 객체에 의해 발생되는 특정 이벤트에 응답할 수 있도록 HTTP 모듈 객체의 Init() 메소드[7]에 코드를 작성합니다. 물체.
ASP.NET은 특정 이벤트에 응답하기 위해 미리 정의된 몇 가지 HTTP 모듈을 제공하며, 웹 소프트웨어 엔지니어는 자신의 HTTP 모듈을 작성하여 "HTTP 요청 처리 파이프라인"[8]에 삽입할 수도 있습니다.
파이프라인 중간(관련 이벤트 처리 후)에서 HttpContext 개체는 최종 Page 개체에 의해 수신됩니다(이것이 Page 클래스에서 정의한 Context 속성을 통해 ASP.NET 페이지에서 HttpContext 개체에 액세스할 수 있는 이유입니다).
액세스된 각 ASP.NET 페이지는 "페이지 클래스에서 파생된 페이지 클래스"로 변환됩니다.
참고: Page 클래스는 ProcessRequest() 메서드를 정의하는 IHttpHandler 인터페이스를 구현합니다.
ASP.NET 페이지 클래스가 생성된 후 자동으로 어셈블리로 컴파일된 다음 해당 ProcessRequest() 메서드가 자동으로 호출됩니다. Page 클래스는 IHttpHandler 인터페이스를 구현하므로 이 메서드가 있어야 합니다. 이 방법에서는 웹 소프트웨어 엔지니어가 작성한 코드가 실행됩니다(있는 경우). ProcessRequest() 메서드의 실행 결과는 다시 한 번 HttpContext 개체에 의해 전달되고 제어는 "HTTP 요청 처리 파이프라인"으로 다시 전송되며 HttpApplication 개체는 계속해서 후속 이벤트를 발생시킵니다. 이때 이러한 이벤트에 응답하는 특정 HTTP 모듈이 있으면 자동으로 호출됩니다.
HttpContext 객체는 최종 처리 결과를 "HTTP 요청 처리 파이프라인"의 마지막 부분으로 가져오고, 해당 정보를 꺼내서 aspnet_isapi.dll을 브리지로 사용하여 다시 작업자 프로세스로 전송합니다. 그런 다음 작업자 프로세스는 HTTP 요청의 처리 결과를 HTTP.SYS로 전송하며, HTTP.SYS는 결과를 브라우저에 반환합니다.
이전 소개에 따르면 전체 HTTP 파이프라인은 전처리 단계 à 처리 단계 à 후처리 단계의 세 부분으로 나눌 수 있습니다(그림 8 ‑14).
그림 8 ‑ 14 HTTP 파이프라인의 세 단계
그림 8-14에 표시된 것처럼 HTTP 파이프라인의 전처리 및 후처리 단계는 주로 여러 HTTP 모듈에 의해 참여되며 이벤트에 의해 구동됩니다. 이 두 단계에서 완료되는 작업은 주로 다양한 속성을 수행하는 것입니다. HttpContext 개체를 수정합니다.
HTTP 요청 처리는 궁극적으로 IHttpHandler 인터페이스를 구현하는 개체에 의해 "처리 단계"에서 완료됩니다. ASP.NET 웹 페이지에서 생성된 모든 페이지 클래스는 이 인터페이스를 구현합니다. PageHandlerFactory 객체[9]는 적절한 HTTP 요청 처리 객체를 생성하는 역할을 합니다.
IHttpHandler 인터페이스를 구현하는 개체가 HTTP 요청 처리를 담당하므로 "Handler(핸들러)"라고 부르는 것을 알 수 있습니다.
가장 일반적인 ASP.NET 웹 페이지 외에도 웹 소프트웨어 엔지니어는 IHttpHandler 인터페이스를 구현하는 자체 개체를 만들고 이를 HTTP 파이프라인에 삽입하여 HTTP 요청을 처리할 수도 있습니다.
HTTP 요청이 처리되면 관련 개체는 해제되지만 생성된 애플리케이션 도메인, HttpApplication 및 기타 개체는 여전히 남아서 다음 HTTP 요청에 응답합니다.
7 ASP.NET 애플리케이션 수명 주기 요약
이 섹션에서는 ASP.NET 응용 프로그램의 수명 주기를 소개합니다. 이는 매우 복잡한 프로세스이며 다음과 같은 비유를 통해 이해하는 것이 더 쉬울 수 있습니다.
l "HTTP 요청 처리 파이프라인"은 현대 공장의 "생산 조립 라인"이며 HttpContext 개체는 이 조립 라인에서 처리되는 제품입니다.
l HttpHandler(HTTP 핸들러) 개체는 제품을 형태로 조립하는 역할을 하는 전체 "제품 생산 라인"의 핵심입니다.
l HttpModule(HTTP 모듈)은 "생산 라인"의 보조 작업자에 해당합니다. 그들은 "전처리"(제품 조립 준비) 및 "후처리"(라벨링 등 제품 배송 준비)를 수행합니다. 제품(HttpContext 객체)).
l HttpApplication 개체는 전체 "생산 라인"의 "리더"입니다. 그는 "생산 라인"에 작업자를 할당하고(등록된 모든 HttpModule을 초기화하고 로드한 다음) 일련의 이벤트("ASP. NET 애플리케이션 이벤트" "), 특정 HttpModule은 특정 이벤트에 응답하는 역할을 담당합니다.
------------------------------------- ----------------------------------
[1] 작업자 프로세스가 없으면 IIS 모니터링 프로그램 WAS가 작업자 프로세스를 생성하고, 없으면 기존 작업자 프로세스를 재사용합니다.
[2] IIS 7 통합 모드에서는 CLR이 미리 로드되어 있으므로 이 단계가 필요하지 않습니다.
[3] "클래스의 인스턴스"와 "클래스의 개체"는 동일한 의미를 가지며 둘 다 클래스를 템플릿으로 사용하여 생성된 개체를 나타냅니다.
[4] 객체 풀(Object Pool)은 객체지향 소프트웨어 시스템에서 흔히 사용되는 객체 구성 방식으로 객체 컨테이너로 간주할 수 있다. 개체 풀에는 미리 생성된 여러 개체가 포함되어 있습니다. 외부 세계에서 객체가 필요할 때 풀에서 기성 객체를 직접 꺼내 사용할 수 있어 잦은 객체 생성으로 인한 성능 저하를 방지할 수 있습니다.
[5] HttpApplication은 몇 가지 이벤트를 정의합니다. 전체 이벤트 목록을 보려면 MSDN을 참조하세요.
[6] 이 메서드는 HttpApplication 개체를 가져올 때 자동으로 호출됩니다.
[7] 모든 HTTP 모듈은 IHttpModule 인터페이스를 구현해야 하며 Init() 메서드는 이 인터페이스에 의해 정의됩니다.
[8] Web.Config에 특정 콘텐츠를 삽입하여 HTTP 요청 처리 흐름에 사용자 정의된 HTTP 모듈을 추가할 수 있습니다.
[9] 이는 ASP.NET 기술 프레임워크의 또 다른 핵심입니다.