码迷,mamicode.com
首页 > Web开发 > 详细

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

时间:2016-01-03 00:20:09      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

  上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):HttpWorkerRequest、HttpRuntime、HttpContext、HttpApplication等。

一、第一个入口:ISAPIRuntme.ProcessRequest()

   ISAPIRuntime是进入NET托管环境的入口,在其PR方法中通过一个ecb句柄指向了当前请求报文体的内存地址,将HTTP请求报文简单封装为一个

ISAPIWorkerRequest对象(此类继承于HttpWorkerRequest对象),然后就是各种我们经常听到的PR(ProcessRequest)方法了。

     Asp.Net中准备用于处理的请求都必须封装为HttpWorkerRequest类型的对象,HttpWorkerRequest是一个抽象类型.

二、第二个入口:HttpRuntime.ProcessRequest()

    当请求进入HttpRuntime,由它来决定如何处理请求。默认情况下在machine.config和Web.config中并没有显式定义httpRuntime节点,但该节点是有默认值的。通常情况下,我们可以在Web.config中更改httpRuntime节点的默认值。

    此PR方法主要将上一步的HttpWorkerRequest对象封装成HttpContext对象这是一个重要的Http上下文对象,两个重要类型的字段也随之被初始化:HttpRequest对象和HttpResponse对象。我们通过HttpContext.Current获取到这个实例且该实例会在整个生命周期中存活,通过它还可以获取到一些常用对象,如Request,Response,Session 等。

   接下来通过httpcontext对象获取一个IHttpHandler类型的对象,此对象本质是HttpApplication类型HttpApplication其实就是web应用程序的实例。

在其处理完请求后会进入到应用程序池中而不是立即销毁跟ADO.net连接池一个道理。通过反射的方式可以看出是将Global文件所编译后的类封装出来一个HttpApplication实例。

    现在HttpApplication需要进行初始化请求处理管道来分别处理ASP.Net WebForm或ASP.Net MVC等类型的页面的响应操作。它通过读取Web.config配置文件中关于HttpModule的信息,然后将其传递给HttpModule的集合,遍历集合分别对其每一个HttpModule执行其对应的Init方法。接下来完成HttpApplication 19个管道事件的注册。现在需要的只是调用HttpModule中各个事件对应的执行方法即可。

 

关于请求处理管道:

 

HttpApplication 采用处理管道的方法进行处理,将处理的过程分成多个步骤,每个步骤通过事件的形式暴露给程序员,这些事件按照固定的处理顺序依次触发,程序员通过编写事件处理方法就可以自定义每一个请求的扩展处理过程。

 

对于 HttpApplication 来说,到 ASP.NET 4.0 版本,提供了19 个标准事件,如下图所示:

 

技术分享

 

 至于在请求处理管道中的细节,我们在Part 3中再看,今天就到此为止,谢谢!

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

标签:

原文地址:http://www.cnblogs.com/tiantianle/p/5092755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!