요청 파이프 에서 HttpModule 의 실현 메커니즘 에 대한 설명 을 깊이 있 게 분석 하 다.

밑바닥 의 원 리 를 이해 하려 면 요청 처리 과정 과 페이지 의 생명주기 에 대해 좀 알 아야 만 입문 하여 내용 을 배 울 수 있 습 니 다.요청 처리 과정 과 페이지 의 생명주기 에 대해 다음 날 에 여러분 께 깊이 있 는 설명 을 해 드 리 겠 습 니 다.HttpModule 의 실현 체 제 는 다음 과 같 습 니 다.1.ISAPIRuntime 에 도착 할 때 ProcessReqeust(이하 pr)방법 으로 HttpWrokRequest 대상 을 만 듭 니 다.2.ISAPIRuntime 의 pr 방법 을 실행 할 때 방법 내부 의 HttpRuntime 의 pr 방법 은 HttpWorkRequest 대상 에 따라 문맥 대상 HttpContext 를 만 들 었 습 니 다.3.HttpRuntime 의 pr 방법 내부 에서 HttpApplication Factory 를 통 해 프로그램 을 처리 하 는 HttpApplication 인 스 턴 스 를 만 들 었 습 니 다.메모:HttpApplication 의 생 성 은 Global.asax 파일 을 컴 파일 한 형식 에 따라 반사 적 인 방법 으로 생 성 된 인 스 턴 스 입 니 다.인 스 턴 스 를 만 드 는 과정 에서 시간 과 자원 이 많이 소모 되 기 때문에 대상 풀 기술 4 를 사 용 했 습 니 다.HttpApplication 인 스 턴 스 를 만 드 는 과정 에서 내부 에서 InitInternal 방법 을 호출 합 니 다.이 방법 에서 HttpModule 의 초기 화 방법 을 호출 하여 이벤트 등록 을 실현 하 였 습 니 다.메모:이벤트 의 등록 을 실현 하 는 과정 에서 내부 설정 파일 에서 HttpModule 모듈 이 설정 되 어 있 는 지 찾 고 있 으 면 반사 등록 을 통 해 없 으 면 방법 이 튀 어 나 올 때 까지 계속 내 려 갑 니 다.이 과정 은 바로 마이크로소프트 의 플러그 인 메커니즘 의 구현 이다.5.이벤트 등록 이 완료 되면 HttpApplication 인 스 턴 스 는 자신의 pr 방법 으로 페이지 의 생명 주 기 를 실행 하기 시작 합 니 다.요약:HttpModule 모듈 의 이벤트 등록 은 HttpApplication 인 스 턴 스 내부 에서 InitInternal 방법 을 호출 하 는 것 입 니 다.이 방법 에서 HttpModule 의 초기 화 방법 을 호출 하여 이벤트 등록 을 실현 합 니 다.다음 코드 는 이 과정 을 이해 하 는 데 도움 을 주 는 것 입 니 다.1.먼저 컨 텍스트 류 HttpContext
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
/// <summary>
///
/// </summary>
public class HttpContext
{
}
}
를 정의 합 니 다.2.두 인 터 페 이 스 를 정의 합 니 다.각각 IHttpHandler,IHttpModule
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
/// <summary>
/// , application pr
/// pr 。
/// </summary>
public interface IHttpHandler
{
void ProcessRequest(HttpContext context);
}
}
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
/// <summary>
/// , Application InitInternal
/// </summary>
public interface IHttpModule
{
void Init(HttpApplication application);
}
}
3.페이지 클래스 Page
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
/// <summary>
///
/// </summary>
public class Page:IHttpHandler
{
/// <summary>
/// IHttpHandler
/// </summary>
/// <param name="context"> </param>
public void ProcessRequest(HttpContext context)
{
Console.WriteLine(" ....");
Console.WriteLine("..................");
Console.WriteLine("..................");
Console.WriteLine("..................");
Console.WriteLine(" ...");
}
}
}
를 정의 합 니 다.4.응용 프로그램 클래스 Application
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
public class HttpApplication:IHttpHandler
{
//
public void InitInternal()
{
// HttpModule , , Init !!! MyHttpModule
IHttpModule httpModule = new MyHttpModule();
httpModule.Init(this);
BindEvent();
}
//Application
private void BindEvent()
{
BeginRequest += new EventHandler(HttpApplication_BeginRequest);
PostResolveRequestCache += new EventHandler(HttpApplication_PostResolveRequestCache);
EndRequest += new EventHandler(HttpApplication_EndRequest);
}
void HttpApplication_EndRequest(object sender, EventArgs e)
{
Console.WriteLine("application --EndRequest");
}
void HttpApplication_PostResolveRequestCache(object sender, EventArgs e)
{
Console.WriteLine("application --PostResolveRequest");
}
void HttpApplication_BeginRequest(object sender, EventArgs e)
{
Console.WriteLine("application --BeginRequest");
}

// http
public void ProcessRequest(HttpContext context)
{
//19 ,23
Console.WriteLine(" ");
//
BeginRequest(this, null);
//
PostResolveRequestCache(this, null);
Console.WriteLine(" ");
// ,
IHttpHandler httpHandler = new Page();
Console.WriteLine(" ");
// 11 12 pr
Console.WriteLine(" ");
httpHandler.ProcessRequest(context);
//
EndRequest(this, null);
Console.WriteLine(" ");
}
public event EventHandler BeginRequest;
public event EventHandler PostResolveRequestCache;
public event EventHandler EndRequest;
}
}
을 정의 합 니 다.5.아 날로 그 요청 파이프 의 실행 과정
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
class Program
{
static void Main(string[] args)
{
//ISAPIRuntime
// HttpContext
HttpContext context = new HttpContext();
// HttpApplicationFactory
HttpApplication application = new HttpApplication();
// HttpModule Init
application.InitInternal();
// pr pr
application.ProcessRequest(context);
Console.ReadKey();
}
}
}
6.HttpModule
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HttpApplicationProcessMethodDemo
{
/// <summary>
/// HttpModule
/// </summary>
public class MyHttpModule : IHttpModule
{
/// <summary>
/// IHttpModule
/// </summary>
/// <param name="application"></param>
public void Init(HttpApplication application)
{
//
application.BeginRequest += new EventHandler(application_BeginRequest);
application.PostResolveRequestCache += new EventHandler(application_PostResolveRequestCache);
application.EndRequest += new EventHandler(application_EndRequest);
}
void application_EndRequest(object sender, EventArgs e)
{
Console.WriteLine("HttpModule EndRequest ");
}
void application_PostResolveRequestCache(object sender, EventArgs e)
{
Console.WriteLine("HttpModule PostResolveRequestCache ");
}
void application_BeginRequest(object sender, EventArgs e)
{
Console.WriteLine("HttpModule BeginRequest ");
}
}
}
을 사용자 정의 합 니 다.상기 절 차 를 통 해 전체 파이프 의 실행 과정 과 HttpModule 의 실현 원 리 를 실현 합 니 다.다음은 효과 그림:

좋은 웹페이지 즐겨찾기