HttpApplication负责处理当前的HTTP请求。在HttpApplication初始化过程中,ASP.NET会根据配置文件加载并初始化注册的HttpModule对象。...这似乎意味着在我们的应用程序中只有一个Global对象实例,但是可不是只有一个HttpApplication对象实例。 ASP.NET运行时维护一个HttpApplication对象池。...当第一个请求抵达时,ASP.NET会一次创建多个HttpApplication对象,并将其置于HttpApplication对象池中,然后选择其中一个对象来处理该请求。...通过使用HttpApplication对象来处理到的请求,HttpApplication对象每次只能处理一个请求,这样其成员才可以于储存针对每个请求的数据。...下面我们来了解一下HttpApplication的成员。
HttpApplication负责处理当前的HTTP请求。在HttpApplication初始化过程中,ASP.NET会根据配置文件加载并初始化注册的HttpModule对象。...HttpApplication HttpApplication是整个ASP.NET基础架构的核心,它负责处理分发给它的HTTP请求。...当第一个请求抵达时,ASP.NET会一次创建多个HttpApplication对象,并将其置于HttpApplication对象池中,然后选择其中一个对象来处理该请求。...通过使用HttpApplication对象来处理到的请求,HttpApplication对象每次只能处理一个请求,这样其成员才可以于储存针对每个请求的数据。...下面我们来了解一下HttpApplication的成员。
return state; } 通过查看这段代码,它首先维护着一个HttpApplication池(_freeList,本质上就是一个Stack栈),然后判断可用的HttpApplication实例的数量...那么,如果目前HttpApplication池暂时没有可用的实例呢?..._theApplicationType); 通过此段代码,新建了一个新的HttpApplication实例,通过继续深入查看,原来是通过反射的方式将Global文件所编译后的类封装出来一个HttpApplication...HttpApplication实例被创建,现在HttpApplication需要进行初始化请求处理管道,来分别处理ASP.Net WebForm或ASP.Net MVC等类型的页面的响应操作。...(HttpApplication.EventPostReleaseRequestState, steps); steps.Add(new HttpApplication.CallFilterExecutionStep
httpRuntime Pipe(http运行时管道),Asp.Net这时才开始运行(即HttpRunTime是Asp.Net真正的入口),HttpRunTime会为每个asp.net应用自动创建一个HttpApplication...的) public class Global : System.Web.HttpApplication 再来看一下相对asp而言,新增的Context,Modules,User这三个属性 Context...总体上讲:一个ASPX页面被请求时,最终的生命周期就是由Page中定义的上述事件(还有一些可重载的回调方法)以及以前提到的HttpApplication类中定义的事件(以相应的回调方法)共同触发或调用,...如果先不考虑HttpApplication中的事件处理方法(即不考虑我们在Global.ascx.cs中定义的Application_XXX处理方法),Page中的事件(方法)常规触发(调用)顺序为:...最后再把HttpApplication的事件考虑进来,看下叠加后的顺序,不过先别着急,我们先来看一种特殊情况,如果一个asp.net应用根目录下未设置默认页,这时直接浏览根目录,比如http://localhost
(2)、当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication...Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest...() ps:红色的HttpApplication实例在HttpModule的Init方法中会用到。...4、HttpModule内部事件机制和生命周期 HttpModule对HttpApplication实例进行处理,而HttpApplication有很多事件(对应不同的生命期),这样就衍生出HttpModule...application.CompleteRequest(); //在BeginRequest事件中,使用HttpApplication.CompleteRequest()方法实现
上一篇博文《ASP.NET那点不为人知的事(一)》中我们提到HttpApplication有19个标准事件,在HttpApplication的第8个事件PostMapRequestHandlerExcute...处理HttpApplication的事件 有必要再回顾一下HttpApplication的19个管道事件。 ?...由于HttpApplication对象是由ASP.NETt基础架构来创建和维护的,那么如何才能获取这个对象的引用呢,以便于注册HttpApplication对象的事件?...在ASP.NET中,每当创建一个HttpApplication对象实例,将遍历注册的HttpModule类型,通过反射,依次创建每个注册HttpModule类型的一个对象,并将这个HttpApplication...HttpApplication作用是什么? HttpApplication如何得到这个处理程序对象?
(HttpApplication.EventAuthenticateRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication...(HttpApplication.EventPostAuthorizeRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache...(HttpApplication.EventPostAcquireRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute...(HttpApplication.EventPostRequestHandlerExecute, steps); app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState...steps.Add(new HttpApplication.CallFilterExecutionStep(app)); app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache
HttpApplication 就像其名称体现的一样,HttpApplication基本上可以看成是真个ASP.NET Application的体现。...HttpApplication和置于虚拟根目录的Gloabal.asax对应。...我们首先来看看Application和HttpApplication的关系,虽然我们对一个Application的Request最终都由一个HttpApplication对象来承载。...通过考虑到Performance的问题,ASP.NET对HttpApplication的使用采用Pool的机制:当Request到达,ASP.NET会现在HttpApplication Pool中查找未被使用的...HttpModule 我们上面提到HttpApplication就是一个ASP.NET Application的体现,HttpApplication本身并不提供对Request的处理功能,而是通过在不同阶段出发不同的
代码如下: //开启SSL访问开始 string oldUrl = ((HttpApplication)sender).Request.Url.ToString(); if (!...oldUrl.StartsWith("https://")) { string newUrl = oldUrl.Replace("http://", "https://"); //301重定向 ((HttpApplication...)sender).Response.StatusCode = 301; ((HttpApplication)sender).Response.AddHeader("Location", newUrl)...; ((HttpApplication)sender).Response.End(); //直接重定向 //((HttpApplication)sender).Context.RewritePath
------------------------------------ 当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication...Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest...public void Init(HttpApplication application) { application.BeginRequest += ...HttpApplication application = (HttpApplication)source; HttpContext context = application.Context...application = (HttpApplication)source; HttpContext context = application.Context;
也就是说HttpModule是订阅Asp.net应用程序级事件的入口,依附于HttpApplication对象生命周期的各个事件。...对象,HttpApplication代表了当前的应用程序,我们需要在这个方法内订阅 HttpApplication对象暴露给客户端的事件。...整个过程很好理解: 当站点第一个资源被访问的时候,Asp.Net会创建HttpApplication类的实例,它代表着站点应用程序,同时会创建所有在Web.Config中注册过的Module实例。...在Init()方法内,对想要作出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法需要另写)。...HttpApplication在其应用程序周期中触发各类事件。 触发事件的时候调用Module在其Init()方法中注册过的方法。
看一下HttpApplication这个类的申明: [ToolboxItem(false)] public class HttpApplication : IComponent, IDisposable...对象,HttpApplication实现了IHttpAsyncHandler接口。...(HttpApplication.EventBeginRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest...(HttpApplication.EventPostAuthenticateRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest...(HttpApplication.EventResolveRequestCache, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache
接上篇 我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿)...对于Global.asax,当创建第一个HttpApplication对象才会执行的Application_Start方法。...然后每一个HttpApplication对象会创建HttpModule对象,然后只执行一次Init方法。...但在实际场景中,HttpRuntime会根据请求次数创建多个HttpApplication对象,所以每一个对象都会执行一遍Init方法,那怎么实现只执行一次Init方法来实现类似Application_Start...false; private readonly static object _syncObject = new object(); public void Init(HttpApplication
(如果是第一次运行程序)编译装载global.asax,初始化HttpApplication实例 6.创建响应请求的HttpContext 7.创建承载响应结果的HttpTextWriter 8.找到合适的...HttpHandler(asp.net页面),处理http请求 9.处理session,异常 10.把处理结果反馈个客户 当HttpApplication实例创建后, 会调用InitModules(...)方法, 这个方法会根据webconfig文件中的配置调用相应的HttpModule 这就是可定制的HttpModule 二:通过定制HttpModule来计算页面执行时间 当HttpApplication...HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context... application = (HttpApplication)sender; HttpContext context = application.Context;
我们可以在这基础上作进一步个抽象,将后者抽象成一个HttpApplication对象,那么该管道就成了一个Server和HttpApplication的综合体(如图5所示)。...Server会将接收到的HTTP请求转发给HttpApplication对象,后者会针对当前请求创建一个上下文,并在此上下文中处理请求,请求处理完成并完成响应之后HttpApplication会对此上下文实施回收释放处理...右图所示的UML体现了与HttpApplication相关的核心接口/类型之间的关系。...总得来说,通过泛型接口IHttpApplication表示HttpApplication是对注册的中间件的封装。...当完成了对请求的处理任务之后,HttpApplication对象会自行负责回收释放由它创建的上下文。
我们可以通过应用程序(HttpApplication)的Modules属性获取HttpModuleCollection集合,然后通过name属性,进一步获取HttpModule对象。...整个过程很好理解: 当站点第一个资源被访问的时候,Asp.Net会创建HttpApplication类的实例,它代表着站点应用程序,同时会创建所有在Web.Config中注册过的Module实例。...在Init()方法内,对想要作出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法需要另写)。...HttpApplication在其应用程序周期中触发各类事件。 触发事件的时候调用Module在其Init()方法中注册过的方法。 如果你不了解事件注册等相关内容,请参阅 C#中的委托与事件 一文。...context) { // 注册HttpApplication应用程序 BeginRequest 事件 // 也可以是其他任何HttpApplication暴露出的事件
其中HttpApplication中有一个订阅事件PreRequestHandlerExecute,该事件字面意思就是在请求之前进行处理。...值得一提的是HttpApplication还有很多别的事件 ? image.png PreRequestHandlerExecute是一个事件,其类型为EventHandler。...private void Context_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app =...(HttpApplication)sender; HttpRequest request = app.Context.Request; HttpResponse response =...app.Context.Response; } 通过sender拿到HttpApplication上下文。
我们从HttpApplication说起。先看看微软官方是怎么定义HttpApplication的: 定义 ASP.NET 应用程序中的所有应用程序对象共有的方法、属性和事件。...HttpApplication是整个ASP.NET基础架构的核心,负责处理分发给他的请求。HttpApplication处理请求的周期是一个复杂的过程,在整个过程中,不同阶段会触发相映的事件。...我们可以注册相应的事件,将处理逻辑注入到HttpApplication处理请求的某个阶段。在HttpApplication这个类中定义了19个事件来处理到达HttpApplication实例的请求。...); } 看到Init方法呢接受一个HttpApplication对象,有了这个对象就很容易注册HttpApplication中19个事件中的某个事件了。...这样当HttpApplication对象执行到某个事件的时候自然就会出发。
所有的HTTP请求都会进入IHttpHandler,有IHttpHandler进行最终的处理,而IHttpModule通过订阅HttpApplication对象中的事件,可以在IHttpHandler对...HttpApplication与HttpModule HTTP请求由ASP.NET运行时接管之后,HttpRuntime会利用HttpApplicationFactory创建或从HttpApplication...对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModule,HttpModule在初始化时会订阅...HttpApplication中的事件来实现对HTTP请求的处理。...在ASP.NET MVC5中,Global.asax文件中定义了MvcApplication类,继承自HttpApplication类: public class MvcApplication : System.Web.HttpApplication
领取专属 10元无门槛券
手把手带您无忧上云