`

生命周期请求过程

 
阅读更多

客户端
第一步:用户在地址栏里面输入地址,或者是提交表单
第二步:浏览器内部会将请求封装成HTTP请求报文,并建立Socket连接发送HTTP请求到服务器端
第三步:等待服务器端响应
服务器端:
 1、内核模块
 1.1 内核模块(HTTP.SYS)监听80端口
 1.2 监听到客户端的连接,并解析出请求的协议以及访问的端口
 1.3 查询注册表,并将此请求交给具体处理的进程(默认IIS会注册此过滤模块),此时请求分发给IIS
 -----------------------------------华丽的分割------------------------------------------------------------------------
 2、IIS模块
 2.1 请求来了之后,IIS首先进行校验请求的身份
 2.2 检查请求的文件的后缀,如果是静态文件则直接处理返回(比如:js,html,css,png等)
 2.3 如果是IIS处理不了的动态文件,则直接将请求交给扩展处理程序(比如:.aspx,.ashx,.ascx请求交给aspnet_isapi.dll处理【aspnet_isapi.dll
 是在.Net Framework安装的时候注册的。如果是先安装.Net Framework 后安装IIS可以使用命令:aspnet_regiis -i来进行安装(在cmd和vs的命里行
 里面都要执行一下)】)
 
 IIS内部执行的过程:请求从内核拿到后,交给了w3svc服务,然后此服务去 问IIS要元数据信息,当前请求交给哪个扩展处理。
 -----------------------------------华丽的分割------------------------------------------------------------------------
 3、工作进程阶段(workprocess)IIS6:w3wp.exe  IIS5:aspnet_wp.exe
 下面写的都是针对IIS6和IIS7经典过程:
 3.1 请求先到扩展模块:aspent_isapi.dll(这是一个非托管的程序集,微软写的一个实现了IIS扩展接口的一个COM的程序集。并且已经注册到了IIS
 的扩展中),它是非托管环境和托管环境的桥梁,它负责将请求的报文数据交给aspnet runtime,另外负责将aspent处理后的响应交还给IIS。另外此
 扩展会负责第一次请求来的时候,启动aspent 的runtime(appdomain等)
 -----------------------------------华丽的分割------------------------------------------------------------------------
 以下是托管环境中的代码(我们可以看到所有的源码)
 3.2 请求到达ISAPIRuntime
 此时请求交给public int ProcessRequest(IntPtr ecb, int iWRType)方法处理,其中第一个参数:ecb是windows操作系统的一个句柄,
 句柄的概念:句柄是windows操作系统特殊的标识,代表着操作系统的一个资源,32位操作系统是一个32位的数字,而64位的那就是64位的(了解即可);
    ecb非常niublity。拿到ecb后就可以拿到请求报文的所有的东西,在ProcessRequest方法内部,通过ecb创建了一个HttpWorkRequest实例【HttpWorkRequest
 是一个很原始的对HTTP请求报文做了简单封装,另外封装了对ecb返回数据的封装,也就是说请求都会从这里获得,响应也是从这里返回】 
 3.3 请求交给HttpRuntime类
 请求交给HttpRuntime的private void ProcessRequestInternal(HttpWorkerRequest wr)
 
 第一步:通过HttpWorkerRequest创建HttpContext上下文,此上下文会在整个Appliaction管道中流动,而且是线程安全的,HttpContext
 包含了HttpRequest对象和HttpResponse对象,它们分别封装了Http请求的请求报文以及响应的信息。
 
    第二步:获取Appliaction实例
 HttpRuntime自己不处理当前请求,而是交给一个代理对象HttpAppliaction实例。
    HttpAppliaction实例是通过如下代码获取的:
 IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);
    我们看到了这是做了一个对象池技术,因为HttpAppliaction创建是通过将aspnet项目里面的Global.asax编译成HttpAppliaction类型,然后
 通过反射创建出来,所以实例很宝贵,创建非常浪费性能,微软为了提高性能,使用对象池技术,使得HttpAppliaction得到了重用。在源码内部
 我们看到了对象池使用了lock栈进行了管理。可以看一下反射的代码:
 private HttpApplication GetNormalApplicationInstance(HttpContext context)
 {
  HttpApplication application = null;
  lock (this._freeList)
  {
   if (this._numFreeAppInstances > 0)
   {
    application = (HttpApplication) this._freeList.Pop();
    this._numFreeAppInstances--;
    if (this._numFreeAppInstances < this._minFreeAppInstances)
    {
     this._minFreeAppInstances = this._numFreeAppInstances;
    }
   }
  }
  if (application == null)
  {
   application = (HttpApplication) HttpRuntime.CreateNonPublicInstance(this._theApplicationType);
   using (new ApplicationImpersonationContext())
   {
    application.InitInternal(context, this._state, this._eventHandlerMethods);
   }
  }
  return application;
 }
 
 ************************************************
 在此还做了处理,如果是第一次请求的话,则首先初始化特殊的应用程序池,然后创建一个
 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    说一说servlet的生命周期

    Servlet生命周期就是servlet从创建到销毁的过程,包括加载和实例化,初始化,服务,和销毁4步。  当客户第一次请求时,首先判断是否存在servlet对象,第一次请求时不存在,则由tomcat创建对象,调用init()方法对...

    页面生命周期全解图

    当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件。在我们试图建立Asp.net页面的时候,这个执行周期是不必去...

    ASP.NET的网页代码模型及生命周期

    第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的...

    Asp.net请求的处理过程

    当一个客户端页面访问IIS试图获取一些信息的时候,发生了什么事情?一个请求在通过了HTTP管道后又...本文主要是描述这两个过程,即IIS处理asp.net请求和asp.net的页面生命周期。欢迎大家积极拍砖,共同学习,共同进步

    Vue生命周期钩子的理解

    vue在整个生命周期里面提供了一些函数,可以在内部实现一些业务逻辑,并且这些函数会在一些特定的场合下去执行。(在生命周期的某一个时刻进行触发)。 组件的生命周期钩子函数大致可以分为三个阶段:初始化 、进行...

    基于asp.net MVC 应用程序的生命周期(详解)

    本文我们会详细讨论MVC应用程序一个请求的生命周期,从一个控件到另一个控件是怎样被处理的。我们还会详细介绍一下整个请求的生命周期中,用到的相关组件。因为在平常的开发过程中,我们可能知道怎样去使用MVC框架来...

    Servlet生命周期

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:   Servlet 加载—&gt;实例化—&gt;服务—&gt;销毁。   1.Servlet 通过调用 init () 方法进行初始化。 2.Servlet 调用 service() ...

    跟我学Laravel之请求(Request)的生命周期

    这篇文档包含了关于请求生命周期的高层次概述,以及启动文件和应用程序事件的相关内容。 如果你不能立即理解所有的术语,别灰心,可以先有一个大致的把握,在阅读文档其他章节的过程中继续积累和消化知识。 请求的...

    1管理信息系统.doc

    B、物理结构、功能结构、软件结构、系统结构 C、功能结构、软件结构、概念结构、硬件结构 D、概念结构、存储结构、软件结构、硬件结构 3)MIS的开发过程是连续不断的,不断发展循环的过程就称为系统开发的生命周期。...

    IIS处理Asp.net请求和Asp.net页面生命周期说明

    worker process管理所有的来自客户端的请求并给出响应。它是IIS下asp.net应用程序的核心。 2, application pool. 它是worker process的容器,IIS5及之前的IIS版本均没有application pool的概念。每一个application...

    RetrofitEngine:retrofit的一次封装 * 支持无网络时数据缓存,无需服务器的支持(仅限GET请求) * 支持过滤恶意频繁网络请求,减轻服务器压力 * 支持cookie头数据的自动加载及持久化 * 网络请求数据的处理过程和Activity、Fragment的生命周期一致

    网络请求数据的处理过程和Activity、Fragment的生命周期一致 支持版本更新(新增) OkhttpClient构建 cookiePersistor = new SharedPrefsCookiePersistor(context); cookieJar = new PersistentCookieJar(new ...

    ASP.NET页面生命周期事件

    当页面请求发送到Web服务器时,页面在创建和处理过程中会经历一系列事件。 在本文中,我将

    http-connection-lifecycle:HTTP 连接生命周期的完整详细解释

    HTTP 连接生命周期目录 动机在技​​术面试或其他方面,一个常见的问题是当你在浏览器中输入 URL 时会发生什么? 当您浏览网站时,幕后会发生什么? 典型的HTTP连接生命周期包含什么? 我将尽我所知回答这些问题。 ...

    从请求管道深入剖析HttpModule的实现机制图文介绍

    想要了解底层的原理必须对请求处理过程和页面的生命周期有点了解才方便您入门学习一下内容: 关于请求处理过程和页面的生命周期将会在接下来的日子为大家做一个深入的讲解。 HttpModule的实现机制如下: 1.请求到达...

    【Django的那些事】runserver全生命周期

    【Django的那些事】系列将会分三个方面系统性的分析django框架的源码结构:django runserver 全生命周期、django请求到响应全过程、django rest framework框架及应用分别对应服务如何启动、如何处理client请求和响应...

    apache-tomcat-8.5.50-src.zip

    组件的生命周期管理 用Lifecycle管理启动、停止、关闭 Lifecycle接口预览 几个核心方法 Server中的init方法示例 为啥StandardServer没有init方法 LifecycleBase中的init与initInternal方法 为什么这么设计...

    jsp book3 随书源码

    jsp book 讲解jsp和servlet各个生命周期,请求过程来龙去脉。

    mpvue 页面预加载新增preLoad生命周期的两种方式

    存在的必要性:mpvue开发微信小程序,在页面跳转到新页面的过程中会有200ms左右的延迟,这个200ms如果用来请求新页面的接口,那么跳转到... 我们知道mpvue的生命周期有onLoad mounted onShow 等。  我们自建一个preLo

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    java基础 一、仓库说明 Java基础类型,容器,并发,IO流,...Servlet基础,生命周期执行过程 Http请求详解,握手挥手流程简介 会话跟踪技术,Session和Cookie详解 过滤器、监听器、拦截器,应用详解 Servlet 集成 C3P0

Global site tag (gtag.js) - Google Analytics