Asp.Net运行时对象生成过程以及HttpHandler和HttpModule的处理过程。

现在叙述最终要的过程,当asp.net在IIS的ISAPI获取一个aspx的系统请求,并获得控制权后发生了什么。

首先,它检测内存中是否有负责处理asp.net内容的运行库进程(IIS5是aspnet_wp.exe,IIS6是w3wp.exe),如果没有就创建一个,然后把控制权转给这个进程(就是函数指针跳转操作)。

当这个进程接到控制权后,检查进程里面的此站点的应用程序设置的应用程序域里面是否有HttpRuntime类的实例,没有就新建一个实例。一个服务器内可以有多个HttpRuntime类的实例,原因是一个服务器的IIS可能建立多个站点,而每个站点可能新建多个虚拟目录。但是每个站点仅能新建一个HttpRuntime类的实例,防止占用系统资源过多。

HttpRuntime就是asp.net的运行库程序的基础了。他负责控制每个站点/虚拟目录的asp.net请求(注意不是Http请求),但是它不负责处理请求。HttRuntime对象控制的是HttpApplicationFactory对象,它是一个类工厂对象,负责生成类的。

HttpApplicationFactory类负责控制一个对象池,对象池里面的对象就是我们经常使用的HttpApplication对象。
首先,HttpApplicationFactory负责处理global.ascx程序,并且触发Application_OnStart事件,然后从池中获取一个 HttpApplication 实例,并将要处理的请求放入实例中。如果没有可用的对象,则创建一个新的 HttpApplication 对象。要创建 HttpApplication 对象,需要先完成 global.asax 应用程序文件的编译。然后HttpApplication 开始处理请求,并且只能在完成这个请求后才能处理新的请求。如果收到来自同一资源的新请求,则由池中的其他对象来处理,就是说,如果一个站点有许多用户,那么多个用户的多个请求将由不同的HttpApplication来处理。

应用程序对象允许所有注册的 HTTP 模块对请求进行预处理(注意,这就是HttpModule开始工作了),并找出最适合处理请求的处理程序类型。这通过查找请求的 URL 的扩展和配置文件中的信息来完成。

所以说,最终处理asp.net页的是一个名叫HttpApplication的类实例。按照上面的步骤就可以得出:当HttpRuntime启动HttpApplicationFactory的时候,首先启动的是asp.net自己的事件预处理程序global.ascx,然后才轮到HttpApplication。

aspx的处理定义系统怎么知道的?答案就是从machie.config配置文件获取的。这个文件定义了所有的.aspx,.ashx,.asmx,.ascx等文件的处理程序。

结论:处理流程ISAPI --> aspnet_wp.exe/w3wp.exe --> HttpRuntime -->HttpApplicationFactory --> HttpApplication --> 内容Html

那么,我们是否可以自定义过程处理?可以的,方法就是贴主问的HttpModule(Http模块)和HttpHandle(Http处理器)的作用。

HttpModule就是在HttpApplication处理之前由HttpApplicationFactory运行的global.ascx的事件处理程序的自定义版,它可以让你自己写一个继承IHttpModule接口的类来代替asp.net来处理某个aspx页,甚至所有的aspx页,而不由asp.net帮助你处理。
而HttpHandler是经过global.ascx处理后所进行内容处理的HttpApplication的代替版,就是说你可以自己写一个类,继承IHttpHandler,来代替HttpApplication来处理某个aspx,或者所有的aspx,你可以随心所欲的来处理aspx的任何内容。不过所有的内容处理必须要你自己写代码来处理了,非常方便。

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

屡败屡战数马援

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值