|
저처럼 많은 친구들이 IHttpModule.Init을 애플리케이션 초기화 작업을 할 Application_Start 대안으로 잘못 사용했다는 것을 알게 되었습니다. 하지만 IHttpModule.Init과 Global.asax의 Application_Start 이벤트의 성격은 다르며, IHttpModule.Init은 애플리케이션의 초기화 과정을 직접 대체하는 데 사용할 수 Application_Start ASP.NET 없습니다. 또한 단순히 Init 메서드가 반복적으로 호출되어 프로그램이 재시작되었다는 결론을 내리는 ASP.NET 수도 없습니다. 그 이유는 IHttpModule.Init이 요청 ASP.NET 에 응답할 때 여러 번 호출될 수 있으며, 실제 웹사이트 운영 중에 발생할 가능성이 매우 높기 때문입니다. 왜 IHttpModule.Init이 여러 번 호출되는 이유는, 각 HttpApplication 인스턴스가 한 번에 하나의 요청만 처리할 수 있고, ASP.NET 일정 수의 동시 요청을 지원하기 때문에, HttpApplication 인스턴스가 동시 요청에 대응하기에 부족할 때 여러 번 생성되어 서로 다른 요청에 대응하기 때문입니다. 각 HttpApplication 인스턴스는 새로운 HttpModules 집합을 생성하고 생성 후 Init 메서드를 호출합니다. Application_Start 최초의 HttpApplication 객체가 생성된 후에만 호출되며, 이후 HttpApplication 인스턴스에서는 이 이벤트가 발생하지 않습니다. HttpApplication 인스턴스의 재사용이 IHttpModule Init 메서드 사용에 대한 오해의 주요 원인이라고 생각합니다. 왜냐하면 프로그램 디버깅 시 보통 요청이 하나뿐이고, HttpModule Init 메서드를 반복적으로 실행하는 것은 사실상 불가능하기 때문입니다. 실제 웹사이트 운영 환경에서는 동시 요청이 흔하며, Init 메서드가 잘못 사용되면 실제 환경에서 이상한 문제가 발생할 수 있습니다. 구체적인 내용은 MSDN의 "IIS 5.0 및 6.0 ASP.NET 애플리케이션 수명주기 개요"를 참고하시기 바랍니다. 이 문서에는 이미지가 포함되어 있습니다: Refelector를 사용해 System.Web 어셈블리를 디컴파일하고 IHttpModule.Init 메서드의 호출 관계를 분석할 수도 있습니다. System.Web.HttpApplicationFactory.GetNormalApplicationInstance 메서드를 얻게 되는데, 이 메서드는 HttpApplication 인스턴스가 어떻게 재사용되고 생성되는지 보여줍니다. 요약하자면, IHttpModule.Init은 단순히 Application_Start를 대체하는 용도로만 사용할 수 없습니다. 비교적 간단한 방법은 정적 불 타입 필드를 초기화 태그로 사용하고, HttpModule에서 프로그램이 요구하는 초기화 후 마크를 true로 설정하며, 다음에는 초기화를 반복하지 않는 것입니다. 하지만 BeginRequest 이벤트 등록 같은 코드는 Init 실행 시 매번 실행되어야 합니다. 이 시점의 HttpModule 인스턴스가 다르기 때문에, 등록 이벤트를 반복하지 않고 정적 초기화 마크업 필드를 판단하면 URL 재작성이 때때로 실행되고 때로는 실행되지 않는 이상한 문제가 발생할 수 있습니다.
[신화] HttpApplication 객체 Init 메서드는 한 번만 실행되나요?
답변: 여러 번 실행될 것입니다!!!!
|