您的位置:首页 > 编程语言 > ASP

asp.net 请求、处理、响应原理浅析

2016-03-07 18:48 585 查看
ps:作为一名asp.net开发人员,不了解asp.net原理该是一件多么可怕的事。当然,如果你对asp.net原理不了解也是可以做项目的,可你要想继续提升自己,拿高工资,实在就有点难了。

说实话,写这篇文章本人还是比较有压力的。本人毕业才两年,对asp.net的了解也不是很深入,按理说是不能够写这样的文章的。

网上也有不少的介绍asp.net原理的文章,说实话,都写得不错。可是,很多文章写得不详细、不准确。不详细没问题,就怕不准确,往往是同一个知识点在不同的文章中会有截然不同的解释。作为菜鸟,我也说不好谁对谁错,于是继续百度,接着继续陷入下一个疑惑。。。。。。于是,一不做二不休,我索性就自己动手总结asp.net原理,一方面可以加深自己的印象,另一方面是有些内容我也不是很清楚(文章中间或者最后会列举出),在此抛砖引玉,希望大家能帮我解决疑惑。当然,其中可能有一些方面讲解的不正确,欢迎各位指出,共同学习、改进,谢谢!

本文对一些基础的知识就不再讲解了,不会的请私下了解。

废话少说,先上一张描述Asp.net运行原理的图片,我们结合着图片进行知识扩展、一步一步的深入了解。



Web开发总结为六个字:请求、处理、响应,我们接下来一个一个的讲解。

一、请求

在这里,我们默认浏览器为请求端(不知道够不够准确),用户在浏览器的地址栏中输入一个地址:url,点击确定按钮,这个时候一个Web请求就产生了。

在这个过程中,浏览器为我们做了什么呢?

简单点来说就是浏览器根据我们请求的地址封装http请求报文,,然后通过socket通信将请求报文发送到服务器端。

至于具体的浏览器如何封装请求报文、客户端服务器端如何通过三次握手建立通信、DNS域名解析、Http协议等内容就不在此讲述了,有兴趣的自己查阅。

至此,浏览器的工作告一段落,它就等着从服务器端接收响应。

二、处理

Http请求报文通过Socket通信就这样来到了服务器端,这个时候该服务器登台表演了。

在继续学习之前,我们需要先简单了解一下IIS。

IIS是一个简单的Web服务器,IIS6.0中将其分为了两部分:内核模块和用户模块,服务器就是通过监听内核模块中的80端口来接收Http请求的,如下图所示。



在内核模块中有一个Http.sys文件,它会对Http请求报文进行简单的解析,如使用的什么协议,请求的地址是什么。接着它会查看服务器上的注册表,如果服务器上安装了IIS,就把请求报文交给IIS,如果没有安装则会直接返回。

在用户模块中有一个w3svc服务和一个IIS主进程(Inetinfo.exe)。Inetinfo.exe中存放着IIS所有的配置信息,如.aspx .ashx扩展的文件交给谁处理。w3svc服务会对请求的地址进行分析,分析请求的后缀,分析请求具体交给谁来处理。

浏览器请求的内容要分两种情况,是静态文件还是aspx、ashx等动态文件。

(1)如果是.css、html、js等静态文件,它会直接把这些静态文件读取进来,转换为字节数组,然后放到响应报文中,按照原路返回给浏览器。

(2)如果是aspx、ashx、cshtml等动态文件,IIS会读取Inetinfo.exe中的配置信息,将请求交给具体的扩展,在这里是asp.net_isapi.dll扩展(所谓的扩展就是实现了IIS接口的一些类,针对某些特殊的请求而服务)。接着请求报文会由w3svc服务交给具体的工作进程。

在进一步学习之前,我们先来了解一下IIS5.0 和IIS6.0的区别。

(2)IIS5.0中的工作进程是asp.net_wp.exe ,IIS5.0版本中将每个网站放在一个单独的应用程序域中,通过应用程序域隔离各个网站之间的相互影响,但是这样并不能完全的避免各个网站之间的相互影响:应用程序域之间是共享进程资源的,某个网站出错,可能会造成资源的不能及时释放,造成进程间的死锁。一个进程中可能包含多个应用程序域。

(1)IIIS6.0以上的版本进行了改进,工作进程为w3wp.exe,把每个网站都放在一个单独的工作进程中,这样就可以做到绝对的隔离各个网站之间的相互影响。一个应用程序池中还可能包含有多个工作进程。



在这个过程之前的操作都是非托管代码。

请求交给asp.net_isapi.dll扩展之后,扩展会查看asp.net运行环境是否启动了起来,如果没启动,它会启动asp.net的运行环境,这个时候就进入了托管环境。

asp.net_isapi.dll扩展会将请求交给ISAPIRuntime,ISAPIRuntime会调用自己的ProcessRequest()方法。在方法的参数列表中有一个ecb句柄,指向了当前请求报文的地址(里面放着请求的所有信息),会根据这个句柄创建一个HttpWorkRequest对象。

接着会调用HttpRuntime的ProcessRequest方法,这个方法以就以前面创建的HttpWorkRequest对象为参数。

在该方法的内部创建了两个对象:

(1)HttpContext对象

该对象是通过HttpWorkRequest对象创建的,里面封装了请求、响应报文的内容。



(2)HttpApplication对象

HttpApplication对象的创建是通过对象工厂创建的,其中也使用到了对象池技术、生产者、消费者模式等内容。简单点来说HttpApplicationFactory会首先查看对象池中有没有空闲的对象,如果有则直接返回,如果没有则会通过global.asax文件编译的类型反射出一个实例出来。Application对象在创建完成之后需要初始化,在这个初始化的过程中我们可以进行管道事件的注册操作。具体操作方法详见后续文章。

注意,两个对象的创建是有先后顺序的,先创建上下文对象在创建Application对象(Application对象的管道流通需要使用上下文对象作为参数)。接下来就是执行Application对象的ProcessRequest()方法执行管道,进行管道的流通。具体内容详见后续文章。

最后列出本人学习中的疑惑:

(1)接着请求报文如何由w3svc服务交给具体的应用程序池的 ? 通过某个Id标示符还是什么

(2)类似于上面,请求如何交给某个应用程序池里某个具体工作进程的

希望对asp.net原理了解比较深入的人帮忙解惑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: