요청 파이프 에서 HttpModule 의 실현 메커니즘 에 대한 설명 을 깊이 있 게 분석 하 다.
7396 단어 HttpModule실현 메커니즘
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 의 실현 원 리 를 실현 합 니 다.다음은 효과 그림: