目录:
一、MVC原理解析
二、HttpHandler
1.HttpHandler,IHttpHandler,MvcHandler的说明
2.IHttpHandler解析
3.MvcHandler解析
三、HttpModule
1.HttpModule能干什么
2.HttpModule的使用
3.HttpModyle和HttpHandler如何区分
4.UrlRoutingModule解析
一、MVC原理解析
当我们收到一个URL的请求是,服务端收到请求,主要经历以下几个步骤:
1.请求被UrlRoutingModule部件拦截
2.封装请求上下文HttpContext,成为HttpContextWrapper对象
3.根据当前的HttpContext,从Routes集合中得到与当前请求URL相符合的RouteData对象
4.将RouteData与HttpContext请求封装成一个RequestContext对象
5.根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler(MVC里面会有一个IHttpHandler的实现类MvcHandler)。
6.执行IHttpHandler(MVCHandler),然后就是通过反射激活具体的controller,执行具体的action。
1.整个过程有两个核心的组件。UrlRoutingModule和MvcHandler,上文提到的各个过程都和两个组件有紧密的联系。而这两个组件分别继承Ihhtmodule和IhttpHandler接口,熟悉Asp.Net管线事件的朋友应该记得这两个接口。
2.UrlRoutingModule的作用可以理解为通过一系列的与路由相关的组件去解析当前请求的Controller与Action名称,其实简单点理解,比如我们请求的http://localhost:8080/Home/Index这个url的时候,UrlRoutingModule拦截到这个请求,然后通过一系列的方式得到这里的“Home"和”Index"
3.MvcHandler的作用就更加直接,上述通过拦截组件得到了请求的Controller和Action的名称,MvcHandler组件将当前请求的Controller名称反射得到对应的控制器对象,然后执行对应的Action方法。比如还是上述http:/localhost:8080/Home/Index这个请求,通过字符串“Home”反射成为Home这个类型的控制器对象,然后调用这个对象的Index()方法。
4.综上,联合这两个组件来理解,UrlRoutingModule组件的主要作用是解析当前的Controller与Action名称,MvcHandler的作用是将得到Controller名称激活,得到具体的Controller对象,然后执行对应的Action方法。
二、HttpHandler
HttpHandler指所有实现IHttpHandler接口一类类型的统称,他是一个大的称谓。这些类型有一个共同的功能,那就可以用来处理http请求。
IHttpHandler是微软定义的一类接口,用来约束所有能够处理的http的类型的接口规则
MVcHandler是MVc里面实现IHttpHandler接口的类型,也就是说,MvcHandler是Mvc里面处理Http请求的类型。
总而言之,HttpHandler只是一个逻辑称谓,它并不存在,而IhhtpHandler和MvcHandler是.net framework里面具体存在的接口和实现类,是前者的表现形式。
IHttpHandler解析
做过webform开发的应该直到,在asp.net的页面生命周期里面,一共有24个管线事件,完整的管线使劲按可参考msdn文档:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
在整个管线事件中,有两个重要的角色就是HttpHandler和HttpModule。
Asp.net 中常见的httphandler类型
?
1 2 3 4 5 6 7 8 |
|
接口的定义很简单,ProcessRequest()方法里面传一个当前请求的上下文对象去处理当前的http请求
为了处理异步请求,framework里面还定义了一个异步的IHttpHandler接口:
?
1 2 3 4 5 6 |
|
接口的两个方法应该也不难理解。
HttpHandler的主要作用是处理http请求,一般处理程序还记得吗,ashx。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
然后运行,通过http://localhost:8080/DemoHandler.ashx?username=admin&password=admin去访问一般处理程序,既可以得到正确的结果。
当然,除了这个,我们还有最常见的aspx页面
?
1 2 3 4 5 6 7 |
|
将page类转到定义
发现原来page类也是继承ihttphandler,这就是为什么可以用地址http://localhost:8080/TestPage.aspx来访问这个页面的原因。当然,子类中的ProcessRequest()方法并没有显示的声明出来,因为在page类里面有一个virtual的虚方法,当然,你也可以显示的声明出来。
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
然后再运行你会发现这个时候请求会进到ProcessRequest()方法,而不会进入到Page_Load()里面了,至于原因,这和Page类里面的封装有关系。当然这不是本文的重点,本文要说明的是所有实现了IHttpHandler接口的类型都可以再ProcessRequest()方法黎曼处理当前的http请求。
当然,除了ashx和aspx之外,还有一类http的服务接口处理文件asmx也和IHttpHandler有着不可分割的联系,可以说,再asp.net里面,只要是处理http请求的地方,IhttpHandler几乎“无处不在"
当然,除了上述asp.net自带的HttpHandler之外,我们也可以自定义HttpHandler处理待定的请求。比如我们新建一个Demo.cs页面
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
当然,要使用这个自定义的handler需要在web.config里面加上配置。
?
1 2 3 4 5 |
|
这个配置的意思就是所有的url一asex结尾的请求都交给DemoHandler这个类去处理
localhost:8080/DemoHandel.asex
页面就会显示内容
MvcHandler解析
上文介绍了那么多的KHttpHandler的用法,都是webform里面的一些实现,我们知道了所有实现了IHttpHandler的类都可以处理Http请求。同样在MVC里面。也定义了一个实现IhttpHandler接口的类型,MvcHandler,用于处理当前http请求。通过反编译工具可以看到:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
MvcHandler实现了IHttpHandler,IHttpAsynHandler两个接口,异步请求这里先不做介绍。重点还是来看看ProcessRequest()方法
将HttpContext转换为HttpContextBase对象,继续转到定义
这里声明了一个IController和IControllerFactory对象,通过this.ProcessRequestInit()方法创建具体的Controller实例。我们将ProcessRequestInit()方法转到定义
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
通过上文的注释可以很好理解整个控制器的实例化过程。本打算看下Controller工厂如何创建以及控制器如何实例化,奈何部分反编译不了。我们暂且理解为反射吧。这些细节并不影响我们理解整个过程。
创建控制器成功之后,就是执行Action方法了,这个过程在上面反编译的第二张图片的controller.Execute(this.RequestContext);方法得到体现。所以,除去细节,理解mvchandler的ProcessRequest()方法并不是太难。
三、HttpModule
除了HttpHandler之外,asp.net里面还有另外一个重要的角色--HttpModule。和HttpHandler类似,HttpModule指所有实现了IhttpModule接口的一类类型的统称。至于HttpModule,IHttpModule,UroroutingModule各个名臣的含义和上述HttpHandler相同,在此不做重复说明。
1.httpmodule能干什么,通过上文,我们直到httphandler的作用非常明确:处理http请求,生成相应的结果