• 1.Asp.net处理请求的流程


    .NET平台处理HTTP请求的过程大致如下:

    1、 IIS得到一个请求;

    2、查询脚本映射扩展,然后把请求映射到aspnet_isapi.dll文件

    3、代码进入工作者进程(IIS5里是aspnet_wp.exe;IIS6里是w3wp.exe),工作者进程也叫辅助进程;

    4、 .NET运行时被加载;

    5、非托管代码调用IsapiRuntime.ProcessRequest()方法;

    6、每一个请求调用一个IsapiWorkerRequest;

    7、使用WorkerRequest调用HttpRuntime.ProcessRequest()方法;

    8、通过传递进来的WorkerRequest创建一个HttpContext对象

    9、通过把上下文对象作为参数传递给HttpApplication.GetApplicationInstance(),然后调用该方法,从应用程序池中获取一个HttpApplication实例;

    10、调用HttpApplication.Init(),启动管道事件序列,钩住模块和处理器;

    11、调用HttpApplicaton.ProcessRequest,开始处理请求;

    12、触发管道事件;

    13、调用HTTP处理器和ProcessRequest方法;

    14、把返回的数据输出到管道,触发处理请求后的事件。

         当客户端向Web服务器请求一个页面文件时,这个HTTP请求会被inetinfo.exe进程截获(WWW服务),它判断文件后缀,如果是*.aspx、*.asmx等,就把这个请求转交给aspnet_isapi.dll,而aspnet_isapi.dll则会通过一个Http PipeLine的管道,将这个HTTP请求发送给w3wq.exe进程,当这个HTTP请求进入w3wq.exe进程之后,Asp.Net framework就会通过HttpRuntime来处理这个HTTP请求,处理完毕后将结果返回给客户端。

        当一个HTTP请求被送入到HttpRuntime之后,这个HTTP请求通过HTTP管道(HttpRuntime是HTTP管道的入口)被送入到一个被称之为HttpApplicationFactory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的HTTP请求,同时HttpApplication实例会创建一个HttpContext对象来记录HTTP请求的上下文,而后这个HTTP请求会依次进入到如下几个容器中:
    HttpModule --> HttpHandler Factory --> HttpHandler
    当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了。

        如果想在中途截获一个HttpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。

    ASP.NET辅助进程w3wq.exe处理管道的过程图如下:

    本图取自孙亚民老师的《ASP.NET中自定义Http处理及其应用》

    过程详解:

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

          对于IIS来说,它依赖于一个叫做HTTP.SYS的内置驱动程序来监听来自外部的HTTP请求。在系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径(实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问的文件不存在时会出现404 错误呢?就是在这一步确定的)。

          服务器处理一个.htm页面和一个.aspx页面肯定是不一样的,那IIS依据什么去处理呢?――根据文件的后缀名。能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(Internet ServerApplication Program Interface互联网服务器应用程序接口),它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。

          所有的.aspx文件实际上都是由aspnet_isapi.dll这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心如何处理这个请求了。

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

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

    HttpWorkerRequest类中。

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

    3. 调用HttpRuntimeProcessRequest方法。

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

    摘自:http://hi.baidu.com/heyinjie/item/6ddd09130addfc24f7625ce8

  • 相关阅读:
    my first blog
    CentOS启动报错:Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block
    J2EE在Web容器中启动报错:com.sun.jdi.InvocationException occurred invoking method.
    SVN报错:can't open file db/txn-current-lock:permission denied 解决方法
    Linux(CentOS6.4、CentOS6.3)下安装、配置PostgreSQL9.2
    [模板] 线性代数:矩阵/高斯消元/矩阵求逆/行列式
    [模板] 杂项:二分/离散化/随机数/其他
    [模板] 图论:存储/拓扑排序
    Luogu1137 旅行计划(拓扑排序)
    C++模板、.vimrc和一些Linux配置
  • 原文地址:https://www.cnblogs.com/kaipengli/p/3566170.html
Copyright © 2020-2023  润新知