• IIS 5.X中的ASP.NET

    • 实现了Web Server和ASP.NET App的分离.

      • IIS作为Web Server运行在InetInfo.exe进程上.该进程是非托管的本地进程.
      • ASP.NET App运行在aspnet_wp的Worker进程上.该进程初始化时会加载CLR,所以是一个托管进程.
    • 通过创建虚拟目录将资源Host到IIS下,然后就可以通过IIS访问所有资源.
      • Server会区分静态资源和动态资源.
      • 对于静态资源的请求,不需要Server进行任何的处理,直接提取对应的文件作为Response返回给Client.
      • 对于动态资源.IIS将请求传递给处理程序.然后处理完毕后再经由IIS将结果回传给Client.
        • IIS的处理程序是通过ISAPI Extension实现的.
        • IIS的元数据数据库维护者一个负责把不同类型的资源映射为对应的ISAPI Extension的Mapping.
        • 对应于ASP.NET,是ASP.NET ISAPI.其通过aspnet_isapi.dll加载.
    • 对于不同虚拟目录下的web应用.都是运行于同一进程上下文(aspnet_wp)中.
      • 为了提供隔离性.引用了APP Domain.
    • IIS处理ASP.NET的流程
      • 对于asp.net的请求.IIS根据Mapping表,将请求交由ASP.NET ISAPI处理.
      • 加载aspnet_isapi.dll.接着创建aspnet_wp的worker进程.
      • worker进程加载CLR来创建一个托管环境.
      • CLR初始化时,会创建一个APP Domain.
      • 这样,流程就被拖入到了ASP.Net HTTP Runtime Piepeline的范畴内.
      • 一台PC只有一个aspnet_wp进程.每一个ASP.NET APP对应一个APP Domain.
      • ISAPI除了负责创建aspnet_wp进程外,还会监测其性能,当性能降低到一定的下限时,关闭该进程.并在下次请求时,重新创建.
    • 由于在不同的进程中运行,所以IIS和ASP.NET之间的通信属于IPC.
      • 采用命名管道来提高性能.
      • ISAPI异步地把请求传递给Worker process并得到结果.
      • 而worker process同步地从ISAPI中得到基于server的变量.
  • IIS 6.X
    • IIS 5.X模型的缺陷

      • 在性能上,由于受不同进程间通信的影响,不能从根本上提升性能.
      • 在可靠性上.APP Domain提供了各个APP间的隔离性.但是一旦aspnet_wp进程崩溃,所有的ASPNET APP都会受到影响.
    • IIS 6.X的改进
      • 在可靠性上.引入APP Pool.

        • 初始化时首先创建若干APP Pool.
        • 在创建ASP.NET APP时,我们为其指定一个APP Pool.
        • 在运行时,一个APP Pool对应一个worker process(w3wp.exe).
        • 同一机器上可以有多个worker process.每个Pool中的每一个APP Domain对应于一个ASP.NET APP.
      • 在性能上
        • 对于请求的监听和分发被转移到Kernel Mode上来(组件http.sys)。
        • 请求到达后,http.sys把它传递到正确的APP POOL 队列中,每一个队列属于特定的Pool,即属于特定的工作进程.
        • 接下来工作进程从队列中接受请求.降低了进程间通信带来的性能损失,且可以在工作进程故障时,仍可以接受请求.
      • 每个工作进程有一个应用程序池.w3wp.exe与asp.net不相关,用于处理所有类型的请求,其根据要求的资源类型来加在不同的ISAPI模块.
    • IIS 元数据数据库中保存着负责APP POOL 和 worker process的映射(1:1)。
      • 在http.sys收到请求后,先查看应该被哪一个APP Pool处理。
      • 如果该pool不存在,创建之。否则,直接发到对应pool的queue上。
      • WAS(web管理服务)根据映射把请求发到worker process.
      • worker process 初始化时,加载ISAPI,ISAPI加载CLR.
  • ISAPI运行时(Runtime)
    • ASP.NET本质上就是一个处理器.

      • 接受来自IIS(ISAPI)投递的HTTP请求,经过一系列的处理后,返回响应.
      • ISAPI运行于非托管环境.它经过一系列的COM调用,最终调用一个托管的,继承自System.Web.Hosting.ISAPIRuntime类的对象.该对象实现了IISAPIRuntime接口.该接口又是基于COM的.IIS调用该对象的ProcessRequest从非托管进入到托管环境.
      • ECB(执行控制块)

        • ISAPIRuntime通过它来实现对ISAPI的间接访问.

        • ISAPI对Runtime的调用是异步的.有时会造成得不到对应的ISAPI生成的响应.所以,在调用ProcessRequest方法时,ISAPI将自己的ECB传过去.这样,Runtime不仅能将结果传回,而且能够通过ECB来得到一些信息.

        • int ProcessRequest([In] IntPtr ecb, [In, MarshalAs(UnmanagedType.I4)] int useProcessModel);通过传入的ECB和iWRType创建一个ISAPIWorkerRequest对象,然后将该对象作为参数调用HttpRuntime.ProcessRequestNoDemand.
    • HTTPContext体现请求的上下文,其生命周期的结束是请求处理结束或超时.
      • HTTPApplication整个Asp.Net APP的体现.对应于虚拟目录的Gloabal.asax.其本身包含了对请求的各种处理.通过在不同阶段调用我们注册的方法来工作.
    • APPDomain:虽然对一个APP的请求最终都有HTTPApplication来承载.但是,由于pool的出现,app不再唯一对应一个固有的HTTPApplication对象.
      • 对于一个APP,可能出现多个APP Domain与之对应:在当前APP处理请求时.我们修改了设置文件,这个修改会立即生效.对于改动后的请求,会创建一个新的APP Domain.而原来的APP Domain会持续到请求完成.
      • HtppModule就是一个ASP.NET APP的体现.以plug-in方式: 在外部定义一些请求处理功能,再使用Module封装它,再将其注册到APP上.
        • 各方法: Dispose,init(),我们在自定义的实现了该接口的Module中的init方法内:application.事件+=new EventHandler(….)在machine.config和web.config中有其定义.
      • HttpHandler:关注于基于某种类型的资源的请求.
    • ISAPI扩展是使用Win32.dll实现的模块。IIS使用它来处理特殊的资源。
      • ISAPI扩展和文件的映射通过IIS来配置,并被存储在IIS元数据中。每一个文件扩展可以和特定的ISAPI扩展进行关联,IIS在接收到这种文件的请求后,就给相应的ISAPI扩展进行处理。(例如.asp扩展被映射到asp.dll的ISAPI扩展).
      • ASP.NET会配置IIS,使得特定的ASP.NET文件请求被送到aspnet_isapi.dll扩展进行处理.
  • 从IIS到HTTP处理器的处理流程
    • l        IIS得到一个请求

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

      l        代码进入工作者进程(IIS5里是aspnet_wp.exe;IIS6里是w3wp.exe)

      l        .NET运行时被加载

      l        非托管代码调用IsapiRuntime.ProcessRequest()方法

      l        每一个请求调用一个IsapiWorkerRequest

      l        使用WorkerRequest调用HttpRuntime.ProcessRequest()方法

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

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

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

      l        调用HttpApplicaton.ProcessRequest,开始处理请求

      l        触发管道事件

      l        调用HTTP处理器和ProcessRequest方法

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

  • 深入ISAPI
    • 作为约定,ISAPI支持ISAPI扩展(extensions)和ISAPI过滤(filters)。

      • 扩展是请求处理接口,提供了跟Web Server输入和输出相关的逻辑处理。从本质上来说,它是一个事务接口。ASP和ASP.NET都被看作ISAPI扩展的实现。
      • ISAPI过滤是钩子接口,它允许你查看进入IIS的每一个请求并且可以修改请求的内容(包括输入和输出)或者改变模块(如:身份验证等)的行为。
      • ASP.NET通过两个方面的内容:HTTP处理器(对应ISAPI扩展)和HTTP 模块(对应ISAPI过滤)映射到ISAPI.
    • ISAPI是代码的初始点,标识ASP.NET一个请求的开始。ASP.NET映射了不同的扩展到它的ISAPI扩展,当一个请求进来的时候,IIS会检查脚本映射,然后把请求路由到aspnet_isapi.dll.
    • IIS5直接把aspnet_isapi.dll寄宿在inetinfo.exe进程里.
    • IIS6不再直接寄宿像ISAPI扩展的任何外部可执行代码.IIS总会保持一个单独的工作进程:应用程序池。所有的处理都发生在这个进程里,包括ISAPI dll的执行.在IIS6里,ISAPI扩展运行在应用程序池的工作进程里。而.NET运行时也运行在这个进程里,所以ISAPI扩展和.NET运行时的通信是发生在进程内的。这就使得比必须使用命名管道接口的IIS5具有更高的性能.

ASP.NET在IIS 5/6上的运行模型(ISAPI)的更多相关文章

  1. Windows平台部署 Asp.Net Core 3.1.0,将 ASP.NET Core 应用发布到 IIS ,使用 IIS 在 Windows 上托管 ASP.NET Core

    第一部分:本教程介绍如何在 IIS 服务器上托管 ASP.NET Core 应用. 官方文档地址:https://docs.microsoft.com/zh-cn/aspnet/core/tutori ...

  2. [ASP.NET]谈谈IIS与ASP.NET管道

    作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 As ...

  3. IIS中的上传目录权限设置问题

    虽然 Apache 的名声可能比 IIS 好,但我相信用 IIS 来做 Web 服务器的人一定也不少.说实话,我觉得 IIS 还是不错的,尤其是 Windows 2003 的 IIS 6(马上 Lon ...

  4. 如何将ASP.NET-WebApi发布到IIS6.0上(转)

    关于"如何将ASP.NET-WebApi发布到IIS6.0上"的这方面的学习,一开始项目组长让我们接触的时候,我的心情是这样的 哇呜.jpg 当时真的是一脸懵逼啊,对于刚接触asp ...

  5. 利用ASP.NET操作IIS (可以制作安装程序)

    很多web安装程序都会在IIS里添加应用程序或者应用程序池,早期用ASP.NET操作IIS非常困难,不过,从7.0开始,微软提供了 Microsoft.Web.Administration 类,可以很 ...

  6. ASP.NET在IIS的启动优化设置

    ASP.NET在IIS的启动优化设置 约定: IIS=Internet Information Services Manager 概要 因为ASP.NET 程序在第一次启动的时候需要等待太长时间,至少 ...

  7. IIS 在 Windows 上托管 .NET Core2.0

    使用 IIS 在 Windows 上托管 ASP.NET Core2.0 https://www.cnblogs.com/sundar/p/9195550.html 阅读目录 准备: 第一步:新建项目 ...

  8. Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门

    关于Jenkins的使用及安装,上一篇文章我已经介绍过了,Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门.这篇主要是在jenkins如何安装SVN和MSBuild. ...

  9. ASP.NET Core MVC 在linux上的创建及发布

    前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...

随机推荐

  1. RAP开发入门-主题更换

    通过配置扩展点修改应用主题    ps:需要提前准备好主题(theme.css)文件   <!-- 注册主题扩展点 -->    <extension          point= ...

  2. 三维投影总结:数学原理、投影几何、OpenGL教程、我的方法

    如果要得到pose视图,除非有精密的测量方法,否则进行大量的样本采集时很耗时耗力的.可以采取一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,可以利用已得到 ...

  3. (转)Bootstrap 之 Metronic 模板的学习之路 - (6)自定义和扩展

    https://segmentfault.com/a/1190000006815041 前面我们将 Metronic 的结构和源码大致浏览了一遍,Metronic 整个文件包有三百多兆,在实际项目中, ...

  4. SpringMVC(二)@RequestMapping

    学习@RequestMapping注解,参考Spring API 1.@RequestMapping可以修饰在类类型和方法上      ①.修饰在类定义上:   提供初步的URL映射,相对于web应用 ...

  5. Java中 ArrayList类常用方法和遍历

     ArrayList类对于元素的操作,基本体现在——增.删.查.常用的方法有: public boolean add(E e) :将指定的元素添加到此集合的尾部. public E remove(in ...

  6. day09网络编程

    一 操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...

  7. POI操作Excel的三种Workbook的发展和区别

    POI的一些使用方法: 创建流程:(上级为下级的载体) 1.创建Workbook(工作薄): 2.创建Sheet(表单,可以创建多个): 3.创建Row(行): 4.创建Cell(单元格) 接下来分别 ...

  8. Project Euler 27 Quadratic primes( 米勒测试 + 推导性质 )

    题意: 欧拉发现了这个著名的二次多项式: f(n) = n2 + n + 41 对于连续的整数n从0到39,这个二次多项式生成了40个素数.然而,当n = 40时402 + 40 + 41 = 40( ...

  9. php中的form表单

    表单处理 表单的概念在生活中很常见,就像是问卷调查表一样,别人先把问卷发给你,你照着问卷的要求填写,完事过后再将填完的问卷发给别人,从而达到一个将别人需要的信息传递给别人的一种方式. 传统的网页大多数 ...

  10. 使用IDEA 中 实现springboot 热部署 (spring boot devtools版)

    第一步:添加springboot的配置文件 首先我先贴出我的配置 添加依赖包 <!-- spring boot devtools 依赖包. --> <dependency> & ...