zoukankan      html  css  js  c++  java
  • Asp.net编程模型记录1

    Http 请求处理流程

    Http请求刚刚到达服务器的时候

    当WEB服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(NOTE:WEB服务器处理一个.htm页面和一个.aspx页面肯定是不一样的)。那IIS依据什么去处理呢?―― 根据文件的后缀名。


    WEB服务器获取所请求的页面(NOTE:也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在WEB服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。

    能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。

    让我们更进一步地看一下 ISAPI ,看看它到底是什么样子,请按下面的步骤进行:

    1.  打开IIS。

    2.  选择随意一个站点,鼠标右键,“属性”。

    3.  选择“主目录”选项卡。

    4.  选择“配置”。

     <图1. 应用程序配置>

    很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:

    图2. 编辑.aspx文件的处理程序

    一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。现在我们应该知道:Asp.Net 只是服务器(IIS)的一个组成部分而已,它是一个 ISAPI扩展。

     这里需要注意两点:

      当你修改“限制为”后,可以限制页面(文件)只能以某种特定方式访问

     “确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。

     理解宿主环境(Hosting)

     

    - 从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。

    NOTE:二般来说,也可以是张图片。

     当 Web.config文件的内容发生改变 或者 .aspx文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。

     NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是 AppDomain。

     对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。

     NOTE:实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问不存在的文件会出现 404 错误呢?就是在这一步确定的。

      如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。

     NOTE:IIS6.0中叫做 w3wp.exe,IIS5.0中叫做 aspnet_wp.exe

     每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。

     NOTE:可选性能参数,是指诸如 回收机制的设置、超时时间设置 等等。

     接下来进行的事情就是上一章节讲述的 ISAPI 了。

     除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

    1.从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。

    2.在相互隔离的应用程序域AppDomain中加载HttpRuntime。

    3.调用 HttpRuntime的ProcessRequest方法。

      接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

     图3.Asp.Net 的宿主环境

     理解管道(Pipeline)

     在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。

     当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。

     图4. 理解 Http 管道

     我们按编号来看一下这幅图中的数据是如何流动的。

     1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。

     2. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。

     3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:

     public class Page : TemplateControl, IHttpHandler

     可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。

     4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。

      如果我们将注意力只集中在Http请求、HttpHandler和HttpModule上,不去考虑HttpContext和HttpApplication,那么图4.可以简化成下面这样:

     图5.Http请求在HttpHandler 和 HttpModule 中的流动方向

     本文主要讲述的三个内容:

     1.Http请求刚刚到达时IIS时,IIS 所做的工作。

     2.Http请求的宿主环境

     3.Http管道。

  • 相关阅读:
    上周热点回顾(5.9-5.15)团队
    上周热点回顾(5.2-5.8)团队
    上周热点回顾(4.25-5.1)团队
    .NET跨平台之旅:升级ASP.NET Core示例站点团队
    上周热点回顾(4.18-4.24)团队
    上周热点回顾(4.11-4.17)团队
    如何在Eclipse中正确安装Jetty插件并初步使用(图文详解)
    Spark Mllib里如何采用保序回归做回归分析(图文详解)
    机器学习概念之梯度下降算法(全量梯度下降算法、随机梯度下降算法、批量梯度下降算法)
    程序代码里出现illegal character 'ufeff' 和 expected class or object definition的解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/chenlulouis/p/1508959.html
Copyright © 2011-2022 走看看