Asp.Net请求处理过程_服务端 asp.net wed 应用程序(.net framework)接收请求-程序员宅基地

技术标签: asp.net  .net技术类  

一.浏览器发出访问某ASP.NET网页的HTTP请求
假设这个请求是针对此网页所属的ASP.NET应用程序的第一次请求。当此请求到达Web服务器时,由HTTP.SYS(windows操作系统上的一个进程)负责接收,根据此请求的URL,HTTP.SYS将其传递给此ASP.NET应用程序所对应的应用程序池(什么是应用程序池?(1)),由在此应用程序池中运行的工作者进程负责处理请求。
工作者进程接收到这个请求之后,装载专用于处理ASP.NET页面的一个ISAPI扩展 aspnet_isapi.dll,并将HTTP请求传给它。
工作者进程加载完 aspnet_isapi.dll后,由aspnet_isapi.dll负责根据请求文件的后缀名判断(如果判断处理的?(2))是从IIS上返回具体物理文件还是加载ASP.NET应用程序的运行环CLR。
工作者进程工作于非托管环境(指Windows操作系统本身)之中,而.NET中的对象则工作于托管环境(指CLR)之中,aspnet_isapi.dll起到了一个沟通两者的桥梁作用,将收到的HTTP请求(由非托管环境传来)转发给相应.NET对象(处于托管环境中)处理。

二. 创建ApplicationManager对象和应用程序域
加载CLR之后,由ApplicationManager类负责创建一个应用程序域(什么是应用程序域?(3))。每个ASP.NET应用程序(什么是应用程序(4)>都运行于自己的应用程序域中,由唯一的应用程序标识符标识。 每个应用程序域都对应着一个ApplicationManager类的实例,由它来负责管理运行在域中的ASP.NET应用程序(比如启动和停止一个ASP.NET应用程序,在指定的ASP.NET应用程序中创建对象等等)。

三. 创建HostingEnvironment对象
在为ASP.NET应用程序创建应用程序域的同时,会创建一个HostingEnvironment对象,此对象提供了ASP.NET应用程序的一些管理信息(比如ASP.NET应用程序的标识,对应的虚拟目录和物理目录),并提供了一些附加的功能(比如在应用程序域中注册一个对象,模拟特定的用户等等)。

四.为每个请求创建 ASP.NET 核心对象
当应用程序域创建完成之后,一个ISAPIRuntime对象被创建,并自动调用它的ProcessRequest()方法。在此方法中,ISAPIRuntime对象根据传入的HTTP请求创建一个HttpWorkerRequest对象,此对象以面向对象的方式包装了HTTP请求的各种信息(这就是说,原始的HTTP请求信息被封装为HttpWorkerRequest对象)。然后,调用ISAPIRuntime对象的StartProcessing()方法启动整个HTTP请求处理过程(此即“HTTP管线:HTTP Pipeline”),在这个处理过程的开端,一个HttpRuntime类型的对象被创建,前面创建好的HttpWorkerRequest对象作为方法参数被传送给此HttpRuntime对象的ProcessRequest()方法。 在HttpRuntime类的ProcessRequest()方法中完成了一些非常重要的工作其中就有根据HttpWorkerRequest对象所提供的Http请求信息,创建了一个HttpContext对象。HttpContext 对象包含了在编程中非常常见的HttpResponse(返回给浏览器处理过的信息)和HttpRequest(获得Http请求信息) 两个对象。

五. 分配或者生成一个HttpApplication 对象用于处理请求
HttpRuntime类的ProcessRequest()方法除了创建HttpContext对象之外,还完成了另一个很重要的工作就是向HttpApplicationFactory类的一个实例,申请分配一个HttpApplication 对象用于管理整个HTTP请求处理管线中的各种事件。 HttpApplicationFactory对象负责管理一个HttpApplication对象池,当有HTTP请求到来时,如果池中还有可用的 HttpApplication对象,就直接分配此对象用于处理HTTP请求,否则,创建一个新的HttpApplication对象。HttpApplication 在被创建的同时会初始化一系列HttpModule对象(什么是HttpModule对象?(5)) 和一系列HttpHandler对象(什么是HttpHandler对象?(6))。

六.HttpApplication对象启动HTTP管线
HttpApplication对象负责装配出整个“HTTP请求处理管线(HTTP Pipeline)”,可以将“HTTP请求处理管线”与现代工厂中的“生产流水线”做个类比。前面步骤中创建好的HttpContext对象就是这个生产流水线要加工的“产品”,当它流经“生产流水线”的不同部分时,将被进行特定的加工和处理过程。
“HTTP请求处理管线”就是一条现代工厂中的“生产流水线”,
HttpContext对象就是这条流水线上要加工的产品。
lHttpHandler(HTTP处理程序)对象是整个“产品生产线”的核心,由它负责将产品装配成形。
lHttpModule(HTTP模块)相当于“生产线”上的辅助工人,他们对产品(HttpContext对象)进行“预处理”(为装配产品作准备)和“后处理”(为产品出厂作准备,比如贴商标)。

七.处理完成
HttpContext对象带着最后的处理结果来到了“HTTP请求处理管线”的未端,其信息被取出来,再次以aspnet_isapi.dll为桥梁传送给工作者进程。工作者进程再将HTTP请求的处理结果转给HTTP.SYS,由它负责将结果返回给浏览器。

应用程序池和应用程序域的区别:
1.一个应用程序池里可以包含多个应用程序站点。一个应用程序域只有一个应用程序。
2.应用程序池是对应用程序的非托管隔离。 应用程序域是对应用程序的托管隔离。
附件一张:
Net请求简单流程图

—–相关注释—–
①应用程序池:IIS6可以将单个的Web应用程序或多个站点分隔到一个独立的进程(称为应用程序池),可以包含许多应用程序域.应用程序池以独立进程的方式极大的提高了Web服务器的安全和稳定性.还可以方便的构建web garden,通过指定某个应用程序池的最大工作进程工作数量实现.

②请求的如果是静态的物理文件比如一个img ,html 等都会直接从IIS上返回原物理文件,如果是动态需要服务器处理的文件例如.aspx .asp .edmx 等则aspnet_isapi.dll负责加载asp.net应用程序运行的CLR。

③应用程序域: AppDomain是一个应用程序执行的独立环境,为执行托管代码提供隔离、卸载和安全边界. .net应用程序是由许多程序集组成的,然而不像win32程序,asp.net程序是在应用程序域中执行.应用程序域不同于win32的进程.实际上,一个进程可以有任意多的AppDomains,每个Appdomain之间是完全隔离的.运行在不同Appdomain中应用程序是不能共享信息的(全局变量,静态字段),除非用remoting.

④应用程序:asp.net将应用程序定义为所有文件、页、处理程序、模块和可执行代码的总和,该应用程序可在 Web 应用程序服务器上的给定虚拟目录(及其子目录)的范围内调用或运行.

⑤HttpModule对象:在初始化HttpApplication对象时被初始化,一个HttpApplication 可以有多个HttpModule对象,HttpModule对象的主要职责就是在不同时期把相应的事件注册到HttpApplicatioin事件当中去。比如完成身份验证,授权,操作缓存等。Asp.Net MVC UrlRouteModule路由模块就是重写了HttpModele

⑥HttpHandler对象:在初始化HttpApplication对象时被初始化,一个HttpApplication可以有多个HttpHandler对象,HttpHander负责最终处理Http请求。不同的文件有不同的HttpHander负责处理。Asp.Net MVC MvcHandle完成了最终处理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/T_Twory/article/details/51382105

智能推荐

GDBus之dbus服务创建_gdbus g_dbus_server_new_sync-程序员宅基地

文章浏览阅读1.7k次。GDBus 创建dbus服务示例dbus服务响应Method、Property、Signal_gdbus g_dbus_server_new_sync

js跳转页面方法(转)_auto.js跳转抖音个人界面 site:blog.csdn.net-程序员宅基地

文章浏览阅读344次。3布丁足迹;秒后自动跳转……function countDown(secs){ tiao.innerText=secs; if(--secs>0) setTimeout("countDown("+secs+")",1000); } countDown(3);   按钮式:    链接式:  返回上一步_auto.js跳转抖音个人界面 site:blog.csdn.net

关于Centos7上python2.7的pip安装问题_python2.7最高支持pip什么版本-程序员宅基地

文章浏览阅读239次。今天在服务器上安装pip包,遇到很多问题,查阅资料大多说pip版本过低导致,直接更新pip后,问题更加严重再次查资料,最后发现是pip版本过高的问题,python2.7版本最高支持到20.3.4使用easy_install来安装指定版本的pip,问题解决参考来源:https://www.cnblogs.com/hxlasky/p/14504677.html..._python2.7最高支持pip什么版本

“前端智能为安防产生新的数据价值”-程序员宅基地

文章浏览阅读938次。笔者按:文章中很多图片无法观看,读者可前往下面的原文地址阅读。文中有一个视频,读者可以从下面地址下载获得:https://pan.baidu.com/s/1o8sXZGA文章转载自:智慧安防网,地址:链接地址 2017年12月14日,“第五届中国·深圳智慧城市建设高峰论坛”在深圳大中华喜来登酒店盛大开幕!来自全国各地的政企领袖、行业大咖、权威专家、企业代表、媒体_前端智能

数据结构:构造二叉树(前跟中跟,中跟后跟)_中根后根构造二叉树-程序员宅基地

文章浏览阅读4.4k次,点赞8次,收藏26次。先从前序的第一个结点开始,其为根节点,然后在中序中找到该元素,一分为二,中序左边为左子树,右边为右子树,然后从前序中找第二个元素为根结点左子树的根,然后重复上面这个过程,发现出现NULL,跳到右子树。但是,如果在先根遍历中加入反映兄弟结点间的左右次序的信息(如以“^”标明空子树),则可以唯一确定一颗二叉树。当一个结点的左右孩子链都已建立,则以当前结点为根的一棵子树就已建立,返回上一层结点。二叉树的广义表表示语法如下图,其中元素表示结点,“^”表示空子树。,则创建一个结点,该结点的左孩子结点元素是。_中根后根构造二叉树

NetSuite高级打印模板设置_netsuite 如何调整打印模版-程序员宅基地

文章浏览阅读648次。NetSuite有高级打印和普通打印模板两种设置本文通过html进行修改,普通打印模板支持的单据相比高级要多:例如请购单;纸张大小:在高级打印模板设置的时候,只有信纸、A4、A5三种纸张可以进行选择,但是我们可以通过原代码修改 将打印的大小进行修改,源代码的size 修改大小之后,关闭原代码,不能预览,因为没有合适的size;现在只是测试过,但是还没有在针式打印机正式测试,A4纸打印机可以打印出设置大小的单据;<body header="nlheader..._netsuite 如何调整打印模版

随便推点

计算100的阶乘末位0的个数_计算100阶乘中0尾数的个数-程序员宅基地

文章浏览阅读605次。 public static void main(String[] args) throws IOException { BigInteger Num = new BigInteger("1"); int i = 1,count = 0; for(;i&lt;=100;i++) { BigInteger I = new BigInteger(i+"");//将int数i转换..._计算100阶乘中0尾数的个数

关于Free版的EclipseUML-程序员宅基地

文章浏览阅读98次。Omondo EclipseUML分为Studio版和Free版两种,我只用过Free版,对于创建EMF类图来说感觉已经够用了。不过和Eclipse的版本比起来,EclipseUML的升级比较缓慢,目前为止最新的版本还是2005年9月27日放出的,这就造成在新版本Eclipse里EclipseUML可能无法正常运行。20050927版本是针对Eclipse 3.1开发的,现在Ec..._free eclipse

第13课 接续符和转义符-程序员宅基地

文章浏览阅读89次。C语言中的接续符(\)是指示编译器行为的利器示例程序如下: 1 #in\ 2 clud\ 3 e <st\ 4 dio.h> 5 6 in\ 7 t m\ 8 ain(\ 9 )10 {11 pri\12 ntf\13 (\14 "Hello D.T.\n"15 )\16 ..._连接he和灵骑bian的第7÷4的余数个字符和h1 tao的字符数

jquery插件之文字无缝向上滚动-程序员宅基地

文章浏览阅读266次。该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧。此插件旨在实现目前较为流行的无缝向上滚动特效,当鼠标移动到文字上时,向上滚动会停止,当鼠标离开时,向上滚动继续。整体代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://..._文字无缝向上滚动插件

EM算法通俗理解-程序员宅基地

文章浏览阅读54次。https://blog.csdn.net/v_JULY_v/article/details/81708386转载于:https://www.cnblogs.com/bingws/p/10607641.html

算法竞赛进阶指南 0x67 Tarjan 算法与有向图连通性_强连通分支的有向无环图-程序员宅基地

文章浏览阅读204次。有向图G=(V,E)中,如果存在一个点r,使得从r出发,那么就可以到达所有的节点,那么称G为一个流图,记作(G,r)_强连通分支的有向无环图

推荐文章

热门文章

相关标签