应用程序管道开发HttpModule

HttpContext

服务器端对请求处理需要大量参数传递,为了简化服务器端对参数的传递工作,将请求信息和对请求的处理信息封装到HttpContext实例中,每次请求新建一个实例。
用户可以通过HttpContext.Current得到当前实例。所以下面的处理就是对HttpContex的处理。

类型 属性名 说明
HttpRequest Request 请求参数对象
HttpResponse Response 回应处理对象
HttpServerUtility Server 服务实用工具
IDictionary Items 请求过程中传递参数
IPrincipal User 当前用户对象
IHttpHandler Handler 处理当前请求的处理对象
Cache Cache Web服务器的缓存管理对象
HttpSessionState Session 当前请求的会话状态
HttpApplicationState Application 全局状态管理对象
ProfileBase Profile 当前请求的个性化数据对象
DateTime Timestamp 当前请求开始处理的时间点

HttpApplication

HttpRuntime通过HttplicationFactory维护HttpApplicaton应用程序池,HttpApplicaton作用处理HttpContext请求实例,且每次只能处理一个请求。
HttpApplication通过事件管道的方式处理请求,实现方式:实现接口System.ComponentModel.Component,内部维护一事件集合。
HttpAlication的事件管道如下,我们可以通过自定义HttpModule对管道中的事件处理。

事件名称 说明
BeginRequest ASP.NET 针对请求处理的第一个事件
AuthenticateRequest 开始检查用户身份
PostAuthenticateRequest 检查用户身份结束
AuthorizeRequest 开始用户请求权限检查
PostAuthorizeRequest 用户请求权限检查结束
ResolveRequestCache 从当前缓存中检查用户请求
PostResolveRequestCache 缓存检查结束
PostMapRequestHandler 获取处理程序Handler结束
AcquireRequestState 获取当前用户以前的信息,用的Session
PostAcquireRequestState 获取当前用户以前的信息结束
PreRequestHandlerExecute 开始处理程序Handler
PostRequestHandlerExecute 结束处理程序Handler
ReleaseRequestState 释放请求的状态
PostReleaseRequestState 已释放请求的状态
UpdateRequestCache 开始更新缓存
PostUpdateRequestCache 结束更新缓存
LogRequest 日志工作
PostLogRequest 完成日志工作
EndRequest 结束本次请求

自定义HttpModule

自定义HttpModule需要实现IHttpModule接口,并将类注册。注册的方式由两种一种通过config文件,二通过属性加载程序集。自定义HttpModule可以定义自己的事件,可以在Global文件中注册事件。
当然还有者简单的方法直接在Global文件下通过函数扩展。

public class MyModule : IHttpModule
	{
		public event EventHandler ExposeEvent;
		public void Dispose()
		{
			throw new NotImplementedException();
		}
		public void Init(HttpApplication context)
		{
			context.BeginRequest += (app, e) => {
				((HttpApplication)app).Context.Response.Write("ASP.NET 针对请求处理的第一个事件<br />");
				
			};
			context.AuthenticateRequest += (app, e) => {
				((HttpApplication)app).Context.Response.Write("开始检查用户身份<br />");
				OnExposeEvent(app,e);
			};
			context.PostAuthenticateRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("检查用户身份结束<br />"); };
			context.AuthorizeRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始用户请求权限检查<br />"); };
			context.PostAuthorizeRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("用户请求权限检查结束<br />"); };
			context.ResolveRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("从当前缓存中检查用户请求<br />"); };
			context.PostResolveRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("缓存检查结束<br />"); };
			//context.MapRequestHandler += (app, e) => { ((HttpApplication)app).Context.Response.Write("缓存没能检查到请求结果,开始获取请求程序Handler<br />"); };
			context.PostMapRequestHandler += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取处理程序Handler结束<br />"); };
			context.AcquireRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取当前用户以前的信息,用的Session<br />"); };
			context.PostAcquireRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取当前用户以前的信息结束<br />"); };
			context.PreRequestHandlerExecute += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始处理程序Handler<br />"); };
			context.PostRequestHandlerExecute += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束处理程序Handler<br />"); };
			context.ReleaseRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("释放请求的状态<br />"); };
			context.PostReleaseRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("已释放请求的状态<br />"); };
			context.UpdateRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始更新缓存<br />"); };
			context.PostUpdateRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束更新缓存<br />"); };
			context.LogRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("日志工作<br />"); };
			context.PostLogRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("完成日志工作<br />"); };
			context.EndRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束本次请求<br />"); };
		}
		protected void OnExposeEvent(object sender,EventArgs e)
		{
			if(ExposeEvent != null)
			{
				ExposeEvent(sender, e);
			}
		}
	}

注册

	<system.webServer>
		<modules>
			<add name="MyModule" type="Demo01.MyModule,Demo01"/>
		</modules>
	</system.webServer>

注意 这是IIS7后的继承模式的注册,这种模式不论请求时是动态资源还是静态资源,都会通过HttpModule。Iss7之前或IIS经典模式中静态资源不经asp.net直接由IIS返回。

global文件中注册事件

 void MyModule_ExposeEvent(object sender,EventArgs e)
		{
			HttpApplication app = sender as HttpApplication;
			app.Context.Response.Write("Hello<br />");
		}
原文地址:https://www.cnblogs.com/LoveTomato/p/9106952.html