应用程序管道开发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 />");
        }

猜你喜欢

转载自www.cnblogs.com/LoveTomato/p/9106952.html
今日推荐