现在请求经过了Module扩展过滤之后,就要进入到真正处理它的地方了,HttpHandler,提起它,如果我们有点陌生,那么我们一定使用过.Net中的一般处理程序,
我们可以看到一般处理程序是一个ashx文件,其中会继承自IHttpHandler接口,进行ProcessRequest处理。其实我们的HttpHandler就是ashx文件的codeBehind
文件。只要我们实现了IHttpHandler接口中的方法,就定义了一个Handler扩展。
HttpHandler 是作为处理者的角色出现的,不是过滤者,所以Handler会有输出结果。如果你要在Handler中使用Session,那么就要继承IRequiredSessionState
接口,或者加上一个IReadOnlySessionState接口,这样我们操作Session的时候才不会出现错误。在Handler中我们可以进行任何我们想要的操作,例如生成图片
水印、防盗链甚至是文件的输出压缩以及编码等都可以实现。
像我们的Web Service以及一般处理程序,从本质上说都是Handler的一种高层实现方式,都是进行了Handler的扩展操作。
因为我们讨论的是MVC,所以我们不得不考虑路由Route,其实Route是Mvc中的一个单独的组件,它在我们的整个请求中也占据了非常重要的地位。在IIS通过IIS扩
展选择了适当的处理程序来处理这个请求的时候,就是路由出现的时候,路由会根据路由配置分析这个路径的ControllerName以及ActionName,对应的参数值,然
后会把这些参数存储到RouteData中,RouteTable.Routes 是一个路由集合,RouteData和HttpContext上下文就会组成另一个类的对象,RequestContext,我
们在MVC编程的时候,经常会用到这个对象中的一些数据。.Net框架会根据RequestContext对象的值来匹配程序中的Controller以及Action,然后调用
ControllerDescriptor 执行Controller,生成Controller的对象,然后通过ActionInvoke方法来执行具体的Action。
在Action执行完毕,返回对应的视图的时候,整个请求在.Net框架中的处理就算结束了。在输出结果返回到用户浏览器之前,输出结果还会经过Module扩展的最后处
理,输出结果到达IIS,最后IIS通过Http.sys响应到用户浏览器上,用户就可以看到输出结果。
因为一个请求从进入到显示在浏览器上会两次经过Module扩展,这就是为什么我们在web form中可以定义一个开始事件,然后还会有一个完成事件的原因。
总结一下,一个用户发起的请求通过http.sys-->IIS-->aspnet_iisapi.dll-->对应的处理程序-->Module--->Handler-->Module--->IIS-->http.sys-->用户浏览器。
当然这个请求的顺序不是特别的准确,因为省略了好多的细节,但是从大的方面说就是这些功能。可能你会有一个疑问,aspx文件没有是什么时候执行的呢?其实这
个问题我以前也有想过,aspx是在Module之后处理的,但是在handler之后还是之前呢?今天终于得到了答案,其实一个单独的aspx文件就是一个handler,每个
aspx文件在编译的时候都会编译成一个类,这个类继承自Page,但是Page继承自哪里呢?
复制代码 代码如下:
public class Page : TemplateControl, IHttpHandler
我们可以看到Page继承自IHttpHandler接口,这就验证了Page类的执行是在Handler执行的时候触发的。
一个小小的http请求会让我们有那么多的知识要掌握,我们作为程序员对于这个请求的模型应该是很熟悉。但是作为.Net 拖控件开发的程序员,我善意的提醒一下,
如果可以不用控件,我们就别用了,用js、css来代替吧,毕竟html是基础。在Mvc时代到来的时候,,拥抱新技术吧。
我是小兵,没有太多的发言权,所以我就是按小兵的思路来分析大牛们的技术。
您可能感兴趣的文章: