zoukankan      html  css  js  c++  java
  • asp.net原理(总结整理)

     


    概念:ISAPI 服务器扩展是可以被 HTTP 服务器加载和调用的 DLL

    1.当asp.net页面发起请求时,IIS收到请求会根据请求页面的后缀名,交给相应的ASP.NET ISAPI做处理, 

    2.ASP.NET ISAPI安排aspnet_wp.exe处理请求,并监视aspnet_wp.exe(w3wp.exe  iis 6)进程的执行情况。

    3.aspnet_wp.exe的主要任务是将请求交给一系列称为的 HTTP 管道的托管对象

    恰当的比喻:

    如果把ASP.NET ISAPI比做销售经理,那aspnet_wp.exe就是生产经理,而HTTP 管道就是生产的流水线。

    负责流水线的小组就是HttpRuntime,生产经理aspnet_wp.exe会将订单(HTTP请求)交给HttpRuntime小组的工作人员ProcessRequest(HttpWorkerRequest wr),HttpRuntime根据内部的分工,最终由ProcessRequestInternal(HttpWorkerRequest wr)在流水线上进行生产,所以ProcessRequestInternal(HttpWorkerRequest wr)是我们分析的重点。

    ProcessRequestInternal的主要工作是:

    1. 创建HttpContext实例

    2. 对第一次请求进行初始化(EnsureFirstRequestInit)。
    3. 创建HttpWriter实例。
    4. 通过调用HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例。

        创建HttpApplication实例之后就是调用实例的InitInternal方法。

        InitInternal方法主要功能如下:

        4.1 InitModules():根据Web.Config的设置,创建相应的HttpModules。
        4.2 HookupEventHandlersForAppplicationAndModules:根据发生的事件,调用HttpApplication实例中相应的事件处理函数。

        4.3创建很多实现IExecutionStep接口的类的实例并添加到当前HttpApplication实例的_execSteps中,等待回调时执行。

    5. 调用HttpApplication实例的BeginProcessRequest异步处理请求。


     

    详见:http://www.cnblogs.com/aaa6818162/archive/2009/11/13/1602333.html

    1,当接收到一个HTTP请求 

    2,通过iis中的isapi从 http.sys中获取当前的htttp的请求信息,并且将这些信息保存到 HttpWorkerRequest 类中

    3,在相互隔离的应用程序域AppDomain中加载HttpRuntime。 调用 HttpRuntime的ProcessRequest方法( 方法参数HttpWorkerRequest )

    4,Http请求进入 HttpRuntime以后

    5. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。

    HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。、

    6. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。

    这些Module可以做一些执行某个实际工作前的事情

    7. Http请求经过所有的Module之后,它会被HttpHandler处理。

    在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。

    public class Page : TemplateControl, IHttpHandler{
        // 代码省略
    }

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

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

    9.然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,

    10最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

     

     

     在创建好HttpApplication后注意的一些事情

    HttpModule和HttpHandler两者都是在HttpApplication.Init()函数调用的一部分中被载入并附加到调用链上

    //在添加所有事件处理程序模块之后执行自定义初始化代码。
    HttpApplication     public virtual void Init();

     

    总的来说

    1先通过 httpapplication的initinternal方法,初始化各个module

    2再通过httpapplication下的applicationstepmanager的buildestep方法 (按顺序建立各个步骤)

    3httpapplication的beginprocessrequest方法执行建立起来咯各个步骤,即触发httpapplication的生命周期

    httphandel和httpmodel的执行关系

      

    表 1:HttpApplication 对象激发的事件

                      事件                                                          备注

    BeginRequest

    在请求处理开始之前激发

    AuthenticateRequest

    验证调用方的身份

    AuthorizeRequest

    执行访问检查

    ResolveRequestCache

    从缓存中获取响应

    AcquireRequestState

    加载会话状态

    PreRequestHandlerExecute

    在请求即将发送到处理程序对象之前激发

    PostRequestHandlerExecute

    在请求刚刚发送到处理程序对象之后激发

    ReleaseRequestState

    存储会话状态

    UpdateRequestCache

    更新响应缓存

    EndRequest

    在处理结束后激发

    PreSendRequestHeaders

    在发送缓存的响应标头之前激发

    PreSendRequestContent

    在发送缓存的响应正文之前激发

    注意:HTTP 处理程序(HttpHandler)在 PreRequestHandlerExecute 和 PostRequestHandlerExecute 事件之间执行。

     

    HttpApplication是HttpRuntime所创建的吗? 并不是,HttpRuntime只是向HttpApplicationFactory提出请求,要求返回一个HttpApplication对象。HttpApplicationFactory在接收到请求后,会先检查是否有已经存在并空闲的对象,如果有就取出一个HttpApplication对象返回给HttpRuntime,如果没有的话,则要创建一个HttpApplication对象给HttpRunTime。
    关于HttpApplication这个类的方法的实现,就不再一一解释,需要了解的,在类里面写上一个HttpApplication单词,然后右键选择“转到定义“,就可以看到里面的元数据了。

    参考备注:

    ASP。NET的设计思想 http://www.cnblogs.com/aaa6818162/archive/2009/10/30/1592886.html#1688909

    HttpApplication的认识与加深理解  http://www.cnblogs.com/whtydn/archive/2009/10/16/1584584.html

    asp.net原理 《重要》 http://www.cnblogs.com/aaa6818162/archive/2009/11/11/1600987.html

  • 相关阅读:
    爱摘苹果的小明
    盗梦空间
    九九乘法表
    谁是最好的Coder
    画图
    黑色帽子
    a letter and a number
    运维开发面试题
    python 守护进程daemon
    kubernets 应用部署
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1601153.html
Copyright © 2011-2022 走看看