学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(三)

ASP.NET管道

以IIS6.0为例,它在工作进程w3wp.exe中会利用aspnet_isapi.dll加载.NET运行时(如果.NET运行时尚未加载)。IIS6.0引入了应用程序进程池的概念,一个工作进程对应着一个应用程序池。一个应用程序进程池可以承载一个或者多个Web应用,每个Web应用映射到一个IIS虚拟目录。与IIS5.x一样,每一个Web应用运行在各自的应用程序域中。

如果HTTP.SYS接收到的HTTP请求是对该Web应用的第一次访问,在成功加载运行时后,IIS会通过AppDomainFactory为该Web应用创建一个应用程序域。随后一个特殊的运行时IsapiRuntime被加载。IsapiRuntime定义在程序集System.Web.dll中,对应的命名空间为“System.Web.Hosting”,被加载的IsapiRuntime会接管该HTTP请求。

接管HTTP请求的IsapiRuntime会首先创建一个IsapiWorkerRequest对象来封装当前的HTTP请求,随后将此对象传递给ASP.NET运行时HttpRuntime。从此时起,HTTP请求正式进入了ASP.NET管道。HttpRuntime会根据IsapiWorkerRequest对象创建用于表示当前HTTP请求的上下文(Context)对象HttpContext。

随着HttpContext的创建,HttpRuntime会利用HttpApplicationFactory创建新的或获取现有的HttpApplication对象。实际上ASP.NET维护着一个HttpApplication对象池,HttpApplicationFactory从池中选取可用的HttpApplication用于处理HTTP请求,处理完毕后将其释放到对象池中。HttpApplication负责处理当前的HTTP请求。

在HttpApplication初始化过程中,ASP.NET会根据配置文件加载并初始化注册的HttpModule对象。对于HttpApplication来说,在它处理HTTP请求的不同阶段会触发不同的事件(Event),而HttpModule的意义在于通过注册HttpApplication的相应事件,将需要的操作注入整个HTTP请求的处理流程。ASP.NET的很多功能都是通过相应的HttpModule实现的。

最终完成对HTTP请求的处理实现在HttpHandler中,不同的资源类型对应着不同类型的HttpHandler。

1.HttpApplication

HttpApplication是整个ASP.NET基础架构的核心,他负责处理分发给他的HTTP请求。由于一个HttpApplication对象在某个时刻只能处理一个请求,只有完成对某个请求的处理后才能用于后续请求的处理,所以ASP.NET采用对象池的机制来创建或获取HttpApplication对象。

当第一个请求抵达时,ASP.NET会一次创建多个HttpApplication对象,并将其置于池中,然后选择其中一个对象来处理请求。处理完毕后,HttpApplication对象不会被回收,而是释放到池中。对于后续的请求,空闲的HttpApplication对象会从池最中取出。如果池中所有的HttpApplication对象都处于繁忙状态,在没有超出HttpApplication池最大容量的情况下,ASP.NET会创建新的HttpApplication对象,否则将请求放入队列等待现有HttpApplication的释放。

HttpApplication处理请求的整个生命周期是一个相对复杂的过程,在该过程的不同阶段会触发相应的事件。我们可以注册相应的事件,将处理逻辑注入到HttpApplication处理请求的某个阶段。下表按照实现的先后顺序列出了HttpApplication在处理每一个请求时触发的事件名称。

HttpApplication事件列表


名称


描述


BeginRequest


HTTP管道开始处理请求时,会触发BeginRequest事件。


AuthenticateRuest,

PostAuthenticateRequest


ASP.NET先后触发这两个事件,使安全模块对请求进行身份验证。


AuthorizeRequest,

PostAuthorizeRequest


ASP.NET先后触发这两个事件,使安全模块对请求进行授权。


ResolveRequestCache,

PostResolveRequestCache


ASP.NET先后触发这两个事件,以使缓存模块利用缓存的内容对请求直接进行响应(缓存模块可以将响应内容进行缓存,对于后续的请求,直接将缓存的内容返回,从而提高响应能力)


PostMapRequestHandler


对于访问不同的资源类型,ASP.NET具有不同的HttpHandler对其进行处理。对于每个请求,ASP.NET会通过扩展名选择匹配相应的HttpHandler类型,匹配成功后,该事件触发


AcquireRequestState,

PostAcquireRequestState


ASP.NET先后触发这两个事件,使状态管理模块获取基于当前请求相应的状态,如SessionState


PreRequestHandlerExecute,

PostPreRequestHandlerExecute


ASP.NET最终通过与请求资源相对应的HttpHandler实现对请求的处理,在实行HttpHandler前后,这两个事件被先后触发


ReleaseRequestState,

PostReleaseRequestState


ASP.NET先后触发这两个事件,使状态管理模块释放基于当前请求相应的状态


UpdateRequestCache,

PostUpdateRequestCache


ASP.NET先后触发这两个事件,以使缓存模块将HttpHandler处理请求得到的内容得以保存到输出缓存中。


LogRequest,

PostLogRequest


ASP.NET先后触发这两个事件为当前请求进行日志记录


EndRequest


整个请求处理完成之后,EndRequest事件被触发

对于一个ASP.NET应用来说,HTTPApplication派生于Global.asax文件,我们可以通过创建Global.asax文件对HttpApplication的请求处理行为进行定制。Global.asax采用一种很直接的方式实现了这样的功能,这种方式不是我们常用的方法重写或事件注册,而是直接采用方法名匹配。在Global.asax中。我们按照”Application_{Event Name}”这样的方法命名规则进行事件注册,比如Application_BeginRequestf方法处理HttpApplication的BeginRequest事件。

2.HttpModule

ASP.NET拥有一个具有高度可扩展性的引擎,并且能够处理对于不同资源类型的请求。HttpModule功不可没。

当请求转入ASP.NET管道时,最终负责处理该请求的是与请求资源类型相匹配的HttpHandler对象,但是在HttpHandler正式工作之前ASP.NET会先加载并初始化所有配置的HttpModule对象。HttpModule在初始化过程中,会将一些回调操作注册到HttpApplication相应的事件中,在HttpApplication请求处理生命周期中的某个阶段,相应的事件会被触发,通过HttpModule注册的事件处理程序也得以执行。

所有的HttpModule都实现了具有如下定义的System.Web.IHttpModule接口,其Init方法实现了针对自身的初始化。该方法接收一个HttpApplication对象,有了这个对象,事件注册就很容易了。

public interface IHttpModule
{
void Dispose();
void Init(HttpApplication context);
}

ASP.NET提供的很多基础功能都是通过相应的HttpModule实现的,下面列出了一些典型的HttpModule,除了这些系统定义的HttpModule之外,我们还可以自定义HttpModule,通过Web.config可以很容易地将其注册到Web应用中。

(1)OutputCacheModule:实现了输出缓存的功能。

(2)SessionStateModule:在无状态的HTTP协议上实现了基于会话的状态保持。

(3)WindowAuthenticationModule + FormsAuthenticationModule + PassportAuthenticationModule:实现了Window、Forms和Passport这三种典型的身份认证方式。

(4)UrlAuthorizationModule + FileAuthorizationModule:实现了基于URI和文件ACL的授权。

3.HttpHandler

对于不同资源类型的请求,ASP.NET会加载不同的Handler来处理。所有的HttpHandler都实现了具有如下定义的接口System.Web.IHttpHandler,定义其中的方法ProcessRequest提供了处理请求的实现。另一个异步版本的HttpHandler的IHttpAsyncHandler接口继承自IHttpHandler,它通过调用BeginProcessRequest/EndProcessRequest方法以异步的方式处理请求。

public interface IHttpHandler
{
void ProcessRequest(HttpContext context);
bool IsReusable{get;}
}
public interface IHttpAsyncHandler : IHttpHandler
{
IAsyncRequest BeginProcessRequest(HttpContext context,AsyncCallback ch,object extraData);
void EndProcessRequest(IAsyncRequest result);
}

某些HttpHandler具有一个与之相关的HttpHandlerFactory,定义其中的方法GetHandler用于创建新的HttpHandler或者获取已经存在的HttpHandler。

public interface IHttpHandlerFactory
{
IHttpHandler GetHandler(HttpContext context,String requestType,string url,string pathTranslated);
void ReleaseHandler(IHttpHandler handler);
}

HttpHandler和HttpHandlerFactory的类型都是配置在Web.config来使用的。

除了通过配置建立起HttpHandler类型与请求路径之间的映射关系之外,我们还可以调用当前HttpContext具有如下定义的RemapHandler方法将一个HttpHandler对象映射到当前HTTP请求。如果不曾通过调用该方法进行HttpHandler的显示映射,或者调用该方法时传入的参数为Null,真正的HttpHandler对象的映射发生在HttpApplication的PostMapRequestHandler触发之前,默认进行HttpHandler的依据就是Web.config的配置。

public sealed class HttpContext
{
public void RemapHandler(IHttpHandler handler)
}

换句话说,在调用当前HttpContext的RemapHandler方法时指定一个具体的HttpHandler对象,是为了让ASP.NET直接跳过默认的HttpHandler映射操作。由于默认的HttpHandler映射发生在HttpApplication的PostMapRequestHandler事件触发之前,所以只有在这之前调用RemapHandler方法才有意义。

时间: 2024-09-29 18:01:01

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(三)的相关文章

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(一)

IIS/ASP.NET管道 ASP.NET MVC就是建立在ASP.NET平台基础上基于MVC模式的Web应用框架,深入理解ASP.NET MVC的前提是对ASP.NET管道式设计有深刻的认识.由于ASP.NET Web应用大都寄宿于IIS上,接下来会介绍3个主要的IIS版本对各自Web请求的处理方式. 1.3.1 IIS 5.x与ASP.NET IIS 5.x运行在进程InetInfo.exe中,该进程寄宿着一个名为World WideWeb Publishing Service(简称W3SV

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(二)

IIS7.0与ASP.NET IIS7.0在请求的监听和分发机制上又进行了革新性的改进,主要体现在引入Window进程激活服务(Windows Process Activation Service,WAS)分流了原来(IIS6.0)W3SVC承载的部分功能.IIS6.0中W3SVC主要承载着如下三大功能. 1.HTTP请求接收:接收HTTP.SYS监听到的HTTP请求. 2.配置管理:从元数据库(metabase)中加载配置信息对相关组件进行配置. 3.进程管理:创建.回收.监控工作进程. II

学习ASP.NET MVC框架揭秘笔记目录

学习ASP.NET MVC框架揭秘笔记目录 第一章     ASP.NET+MVC 1.1传统的MVC模式 持续更新中,,,,

学习ASP.NET MVC框架揭秘笔记-实例演示:SC模式的应用

实例演示:SC模式的应用 为了对SC模式下的MVP,尤其是该模式下的View和Presenter之间的交互方式有一个深刻的认识,我们现在来做一个实例演示.我们采用员工查询的场景,用ASP.NET Web Forms来建立这个简单的应用. 我们先来定义员工的数据类型,Employee来表示一个员工,有5个属性:ID.姓名.性别.出生日期和部门. public class Employee { public string Id { get; private set; } public string

学习ASP.NET MVC框架揭秘笔记-MVP

1.2.1                      MVP MVP是一种UI架构模式,适用于基于事件驱动的应用框架.MVP中的M和V分别对应MVC的Model和View,而P(Presenter)代替了Controller. 在MVP模式中,能够与Model直接进行交互的仅限于Presenter,View只能通过Presenter间接地调用Model.Model的独立性在这里得到真正的体现,他不仅仅与可视化元素的呈现无关,与UI处理逻辑(Presenter)也无关. MVP不仅仅避免了View

学习ASP.NET MVC框架揭秘笔记-传统MVC模式

1.1传统MVC模式 对于大部分面向最终用户的应用来说,他们都需要具有一个与用户进行交互的可视化UI界面,我们将这个UI称为视图(View).在早期,我们倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面的呈现.用户交互操作的捕捉与响应.业务流程的执行及对数据的存取等,我们将这种设计模式称为自治视图(Autonomuous View  ,  AV). 1.1.1  自治视图 1.1.2  什么是MVC模式

学习ASP.NET MVC框架揭秘笔记-自治视图

1.1.1自治视图 一个典型的人机交互应用具有3个主要的关注点,既数据在可视化界面上的呈现.UI处理逻辑(用于处理用户交互式操作的逻辑)和业务逻辑.自治视图模式将三者混合在一起,势必会带来如下一些问题. 1.重用性.业务逻辑是与UI无关的,应该最大限度地被重用,但是若将业务逻辑定义在自治视图中相当于使他完全与视图本身绑定在一起.除此之外,如果我们能够将UI的行为抽象出来,基于抽象化UI的处理逻辑也是可以被共享的,但是定义在自治视图中的UI处理逻辑也完全丧失了重用的可能. 2.稳定性.业务逻辑具有

学习ASP.NET MVC框架揭秘笔记-什么是MVC模式

1.1.2什么是MVC模式 MVC的创建者是Trygve M.H.Reenskau,他是挪威的计算机专家,同时也是奥斯陆大学的名誉教授.MVC是他在1979年提出的一种主要针对GUI应用的软件架构模式. MVC体现了"关注点分离"这一基本的设计方针,他将一个人机交互应用设计的功能分为Model.Controller和View三部分,他们各自具有如下的职责. 1.Model是对应用状态和业务逻辑的封装,我们可以将它理解为同时包含数据和行为的领域模型.Model接受Controller的请

学习ASP.NET MVC框架揭秘笔记-PV与SC

1.                                   PV与SC 解决View难以测试最好的办法就是让他无须测试.如果View不需要测试,其先决条件就是让它尽可能不涉及UI处理逻辑,这就是PV模式的目的所在. 如果我们纯粹的采用PV模式来设计View意味着我们需要将View中的UI元素通过属性的形式暴露出来.具体来说,当我们为View定义接口的时候,需要定义基于UI元素的属性使Presenter可以对View进行细粒度操作,但这并不意味着我们直接将View上的控件暴露出来.