asp.net 운행 원리 상세 설명

6645 단어 asp.net운행 원리
주요 클래스:System.Web.HttpRuntime System.Web.HttpApplicationFactory System.Web.HttpApplication System.Web.Compilation.BuildManager System.Web.Compilation.ApplicationBuildProvider System.Web.Compilation.BuildProvidersCompiler System.Web.UI.PageHandlerFactory 요청 처리 요약 절차 도:읽 기 제안:Reflector 도구 로 ASP.NET 2.0 의 소스 코드 를 보면 서 읽 습 니 다.분석:브 라 우 저 를 통 해 ASP.NET 2.0 사이트 의 한 asp.net 페이지 에 요청 을 할 때 서버 에서 먼저 IIS 가 요청 을 받 았 습 니 다.IIS 는 asp.net 페이지 를 보 자마자 마음 이 기 뻤 습 니 다.이 요청 은 처리 하지 않 고 ASP.NET ISAPI 에 맡 기 면 됩 니 다.ASP.NET ISAPI 작업 도 수월 합 니 다.그의 주요 임 무 는 aspnet 을 배정 하 는 것 입 니 다.wp.exe 처리 요청 및 aspnet 감시wp.exe 프로 세 스 의 실행 상황,만약 aspnetwp.exe 프로 세 스 가 너무 피곤 해서 임 무 를 잘 수행 할 수 없습니다.ASP.NET ISAPI 는 그 를 퇴직 시 키 고 새로운 aspnet 으로 바 꿔 야 합 니 다.wp.exe 로 일 을 처리 합 니 다.  aspnet_wp.exe 의 주요 임 무 는 일련의 HTTP 파이프 라 는 위탁 관리 대상 에 게 요청 하 는 것 이다.ASP.NET ISAPI 를 판매 매니저 에 비유 하면 aspnetwp.exe 는 생산 매니저 이 고 HTTP 파 이 프 는 생산 라인 이다.파이프라인 을 담당 하 는 팀 은 HttpRuntime,생산 매니저 aspnet 입 니 다.wp.exe 는 HttpRuntime 팀 의 스 태 프 ProcessRequest(HttpWorkerRequest wr)에 게 주문(HTTP 요청)을 맡 기 고 HttpRuntime 은 내부 분업 에 따라 최종 적 으로 ProcessRequestInternal(HttpWorkerRequest wr)이 파이프라인 에서 생산 되 기 때문에 ProcessRequestInternal(HttpWorkerRequest wr)이 우리 분석의 중점 이다.ProcessRequestInternal 의 주요 작업 은:1.HttpContext 인 스 턴 스 를 만 드 는 것 입 니 다.2.첫 번 째 요청 을 초기 화 합 니 다(Ensure First RequestInit).a)Ensure FirstRequestInit 에서 System.Web.HttpRuntime.FirstRequestInit 를 호출 하여 초기 화 작업 을 진행 합 니 다.예 를 들 어 웹.Config 설정 을 Runtime Config 에 읽 고 bin 디 렉 터 리 에서 모든 dll 파일 을 불 러 옵 니 다.3.HttpWriter 인 스 턴 스 를 만 듭 니 다.4.HttpApplication Factory.GetApplication Instance 를 호출 하여 HttpApplication 인 스 턴 스 를 만 듭 니 다.HttpApplication Factory.GetApplication Instance 에는 세 가지 관건 적 인 방법 이 있 습 니 다.HttpApplication Factory.theApplicationFactory.EnsureInited(); HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context); HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context); 다음은 이 세 가지 방법 에 대해 하나씩 분석 하 겠 습 니 다.1)HttpApplication Factory.theApplicationFactory.EnsureInited(); 이 방법 은 HttpApplication Factory 가 초기 화 되 었 는 지 확인 하고 없 으 면 HttpApplication Factory.Init()를 통 해 초기 화 합 니 다.Init()에서 global.aax 파일 의 전체 경 로 를 가 져 온 다음 CompileApplication()을 호출 하여 global.aax 를 컴 파일 합 니 다.그럼 컴 파일 은 어떻게 진행 되 나 요?컴 파일 작업 은 BuildManager 에서 이 루어 졌 습 니 다.BuildManager 는 먼저 GlobalAsaxType(즉 HttpApplication)을 받 은 다음 BuildManager.GetGlobalAsaxBuildResult()=GetGlobalAsaxBuildResultInternal()=EnsureTopLevelFilesCompiled()를 호출 하여 컴 파일 합 니 다.Ensure TopLevelFiles Compiled 에서 Compilation Stage.TopLevelFiles 컴 파일 을 먼저 하고 다음 세 디 렉 터 리 의 파일 을 컴 파일 합 니 다.a.CompileResources Directory();컴 파일 AppGlobalResources 목록 입 니 다.  b. CompileWebRefDirectory(); 컴 파일 AppWebReferences 디 렉 터 리.  c. CompileCodeDirectories(); 컴 파일 App코드 디 렉 터 리.이 어 Compilation Stage.GlobalAsax 컴 파일 을 진행 하고 global.asax 를 컴 파일 합 니 다.방법 호출 상황:CompileGlobalAsax()=응용 프로그램 BuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).GetGlobalAsaxBuildResult 에서 구체 적 인 컴 파일 은 ApplicationBuildProvider 와 BuildProviders Compiler 가 공동으로 완성 한 것 입 니 다.  BuildProvidersCompiler.PerformBuild();컴 파일 작업 을 진행 하 다.ApplicationBuildProvider.GetBuildResult 가 컴 파일 된 결 과 를 얻 었 습 니 다.컴 파일 에 성공 하면 C:\\WINDOWS\\Microsoft.NET\\Framework\\v 2.0.50727\\Temporary ASP.NET Files\\해당 디 렉 터 리 에 유사 한 App 를 생 성 합 니 다.global.asax.mlgx7n2v.dll 파일.컴 파일 생 성 된 클래스 이름 은 ASP.globalasax,HttpApplication 계승.주:웹 디 렉 터 리 에 Global.asax 파일 이 없 으 면 앱 생 성 을 컴 파일 하지 않 습 니 다.global.asax.mlgx7n2v.dll 같은 파일 입 니 다.  2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context); 특정한 HttpApplication 인 스 턴 스 를 만 들 고 applicationOnStart 이 벤트 를 촉발 하여 ASP.global 을 실행 합 니 다.asax 의 applicationStart(object sender,EventArgs e)방법.여기 서 만 든 HttpApplication 인 스 턴 스 는 이 벤트 를 처리 한 후 회수 되 었 습 니 다.  3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context); 이 방법 은 HttpApplication 인 스 턴 스 를 만 들 고 초기 화 합 니 다(System.Web.HttpApplication.InitInternal()방법 을 호출 합 니 다).HttpApplication 인 스 턴 스 를 만 드 는 것 은 실제 에 따 른 것 입 니 다.theApplication Type 을 만 듭 니 다.웹 디 렉 터 리 에 global.asa 파일 이 없다 면,동적 컴 파일 없 이 ASP.global 생 성asax 형식,그럼 HttpApplication 을 직접 예화 합 니 다.ASP.global 을 만 들 었 다 면asax 타 입,그럼 ASP.globalasa 실례 화.HttpApplication 인 스 턴 스 를 만 든 후 인 스 턴 스 를 호출 하 는 Init Internal 방법 입 니 다.InitInternal 방법 도 우리 가 중점적으로 분석 하 는 방법 입 니 다.이 방법의 주요 기능 은 다음 과 같 습 니 다.1.InitModules():Web.Config 의 설정 에 따라 해당 하 는 HttpModules 를 만 듭 니 다.2.HookupEventHandlers ForAppplication AndModules:발생 한 이벤트 에 따라 HttpApplication 인 스 턴 스 에 해당 하 는 이벤트 처리 함 수 를 호출 합 니 다.3.IExecutionStep 인 터 페 이 스 를 실현 하 는 클래스 의 인 스 턴 스 를 많이 만 들 고 현재 HttpApplication 인 스 턴 스 에 추가 하 는exec Steps 에서 리 셋 을 기다 리 는 동안 실 행 됩 니 다.여기 서 HttpApplication 은 비동기 적 으로 요청 을 처리 하고 요청 한 많은 처리 작업 에 을 넣 은 것 을 볼 수 있 습 니 다.exec 스텝 이 리 셋 을 기다 리 는 동안 실 행 됩 니 다.  _execStep 의 주요 처리 업 무 는 다음 과 같다.1)요청 한 경로 에 대해 안전 검 사 를 하고 불법 경로 접근 을 금지 합 니 다(ValidatePathExecutionStep).2)UrlMappings 를 설정 하면 RewritePath(UrlMappings ExecutionStep)를 진행한다.3)이벤트 처리 함 수 를 실행 합 니 다.예 를 들 어 BeginRequest,AuthenticateRequest 등 입 니 다.4)현재 요청 한 HttpHandler 를 가 져 옵 니 다.ASP.NET 페이지 가 실 행 될 때 컴 파일 도 여기에서 진 행 됩 니 다.(MapHandler ExecutionStep)이 처 리 는 System.Web.HttpApplication.MapHttpHandler 를 호출 하 는 방법 입 니 다.MapHttpHandler 에 서 는 먼저 방문 한 주소 에 따라 웹.config 에서 IHttpHandler Factory 를 실현 하 는 유형 을 가 져 옵 니 다.asp.net 페이지 에 대해 서 는 기본적으로 PageHanlder Factory 입 니 다.그리고 PageHanlderFactory 인 스 턴 스 를 만 들 고 GetHandlerHelper 를 호출 하 며 GetHandlerHelper 에서 BuildManager.Create InstanceFromVirtualPath 를 호출 하여 현재 요청 한 ASP.NET 페이지 의 인 스 턴 스 를 컴 파일 하고 만 듭 니 다(컴 파일 되 었 다 면 캐 시 에서 직접 불 러 옵 니 다).Create InstanceFromVirtualPath 는 몇 번 의 방법 으로 호출 되 어 컴 파일 작업 을 BuildManager.CompileWebFile()에 게 주 었 습 니 다.CompileWebFile 은 웹.config 에서 해당 하 는 BuildProvider 를 얻 었 습 니 다..aspx 파일 에 대해 해당 하 는 BuildProvider 는 PageBuildProvider 입 니 다.페이지 컴 파일 을 어떻게 하 는 지 더 이상 분석 하지 않 겠 습 니 다.관심 이 있다 면 ASP.NET 2.0 의 소스 코드 를 더 연구 할 수 있 습 니 다.5)해당 HttpHandler 의.ProcessRequest 방법 을 호출 하여 요청 을 처리 합 니 다(비동기 방식 이 라면 BeginProcessReques 를 호출 합 니 다).(CallHandlerExecutionStep)6)응답 내용 을 Filter 에 기록 합 니 다.(CallFilterExecutionStep)5.HttpApplication 인 스 턴 스 를 호출 하 는 BeginProcessRequest 비동기 처리 요청.위 에서 말 한exec Steps 에서 발생 하 는 많은 일 들 은 HttpRuntime 에서 HttpApplication BeginProcessRequest 를 호출 한 후 BeginProcessRequest 에서 ResumeSteps 를 호출 한 후 실 행 됩 니 다.ASP.NET 2.0 이 실 행 될 때 는 ASP.NET 2.0 에서 매우 복잡 하고 이해 하기 어 려 운 부분 입 니 다.ASP.NET 2.0 이 실 행 될 때 소스 코드 에 대한 연 구 는 ASP.NET 2.0 원리 에 대한 이 해 를 강화 하고 ASP.NET 2.0 응용 프로그램 을 개발 하 는 데 많은 도움 이 될 것 입 니 다.이 글 은 제 가 ASP.NET 2.0 을 처음 배 웠 을 때 ASP.NET 2.0 이 실 행 될 때 더 잘 이해 할 수 있 도록 쓴 것 입 니 다.글 내용 에 대한 비판 과 건 의 를 환영 합 니 다.

좋은 웹페이지 즐겨찾기