深度剖析ASP.NET架构—ASP.NET请求的处理过程(一)
前言
我为什么要写这一系列呢,因为只有了解运行机制,学好底层,对我们更深入的理解一定的问题有帮助
阅读目录
一:ASP.NET的工作原理
二:ASP.NET页面的执行流程
三:ISAPI
四:ASP.NET请求的处理过程
一:ASP.NET的工作原理
我们根据下面这张图来说明ASP.NET是如何来工作的?
1.1 客户请求Web页
我们知道ASP.NET是B/S结构,也就是服务器和浏览器这样一个结构,服务器可以有一台或者多台,对于浏览器可以有无数个,每个客户是通过浏览器来访问服务器的,所以第一步是客户请求Web页。
1.2 Web服务器寻找指令文件
于是这个指令就通过浏览器被发送到服务器上比如:http://www.menglin/test.apx,在服务器上开始寻找指令文件,在我们这里是寻找.aspx文件,如果服务器上没有装.Framework,对于.aspx文件服务器就不知道如何处理了。如果服务器已经装了.Framework,就会找这个指令。
1.3 ASP.NET代码发送给公共语言运行时进行编译
这个指令是谁来处理的呢?是aspnet_isapi.dll这个动态链接库来处理的,可以说在ASP.NET中所有的.aspx文件都是被aspnet_isapi.dll它来处理的,它的作用就是把.aspx文件发送给公共语言运行时进行编译,也就是发送给.Framework里面的公共语言运行时CLR进行编译。
1.4 HTML流返回给浏览器
编译完了以后,把HTML流返回给浏览器。
1.5 浏览器处理HTML流并显示页面
浏览器解释HTML流,并显示页面。
可以看出Web服务器处理的过程就是调用aspnet_isapi.dll处理aspx文件的过程,处理的结果就是一个HTML静态页面。
二:ASP.NET页面的执行过程
2.1 每个.aspx文件实际上是继承page类的,在运行的过程中它从一个类变成了一个对象,这是一个实例化的过程。
2.2 把类转化为一个对象以后呢,被CLR转化为HTML,发送给aspnet_isapi.dll。
2.3 aspnet_isapi.dll然后和IIS交互,把HTML发送给IIS。
2.4 IIS把HTML返回给浏览器。
三:ISAPI
我们前面好几次讲到aspnet_isapi.dll,到底aspnet_isapi.dll是个什么东西呢?
在互联网开始时候,基本上Intent都是静态页面,静态页面是以.HTML文件为代表的,但是随着需求的发展,静态页面已经满足不了需求了,这时候开发者就需要扩展Web服务器的功能,这时候不同的Web服务器厂商都遵循了同一个主题“向Web服务器插入某些组件”,也就是说这在极大程度上丰富了Web服务器,对于Web服务器来说它可以进行功能的扩充,是通过加组件的方式,调用组件来实现一些功能的。所有的Web服务器都允许开发者自己来插入一些组件来增强Web服务器的功能,微软提出了ISAPI(全称是Intent Server API),所以到这里明白了,提供了一种技术,这种技术让开发者向Web服务器插入一些组件来扩充Web服务器的功能。
ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的Web服务器的能力。
ISAPI经常用两个手段实现。
3.1 ISAPI扩展
ISAPI扩展是使用Win32动态链接库来实现的,我们之前提到的aspnet_isapi.dll就是这种方式,这种扩展是通过dll来实现的。
3.2 ISAPI过滤器
客户端每次向服务器发送请求都要经过滤器的,客户端不需要在请求中指定过滤器,只需要把请求发送给Web服务器,Web服务器把请求传递给相关的过滤器,过滤器可能修改请求,执行某些操作。
四:ASP.NET请求的处理过程
ASP.NET请求的处理过程是基于管道模型的,在模型中ASP.NET把HTTP请求传递给管道中的所有模块,每个模块都接收HTTP请求并拥有完全控制权,模块可以用自认为合适的方式来处理请求,一旦HTTP请求经过所有HTTP模块,最终被HTTP处理程序所处理,HTTP处理程序队请求做一些处理,并且结果将再次经过管道中的HTTP模块。类似一个管道似的。