• 深度剖析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模块。类似一个管道似的。

          

  • 相关阅读:
    WebGL-四之二
    WebGL-四之一
    mybatis中批量更新的问题
    nginx+tpmcat+redis实现session共享
    myeclipse快捷方式汇总
    StringBuffer的append方法比“+”高效
    《Thinking in Java》 And 《Effective Java》啃起来
    JAVA链表中迭代器的实现
    myeclipse从SVN检出项目报错
    C#中清空ListView中的数据
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2309345.html
Copyright © 2020-2023  润新知