应用程序管道开发HttpModule

HttpContext

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

类型属性名说明
HttpRequestRequest请求参数对象
HttpResponseResponse回应处理对象
HttpServerUtilityServer服务实用工具
IDictionaryItems请求过程中传递参数
IPrincipalUser当前用户对象
IHttpHandlerHandler处理当前请求的处理对象
CacheCacheWeb服务器的缓存管理对象
HttpSessionStateSession当前请求的会话状态
HttpApplicationStateApplication全局状态管理对象
ProfileBaseProfile当前请求的个性化数据对象
DateTimeTimestamp当前请求开始处理的时间点

HttpApplication

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

事件名称说明
BeginRequestASP.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值