转http://www.cnblogs.com/loongsoft/p/7272830.html

IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

 前言:
     记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别?
     促使我对进程池进了知识的学习,所以记录一下学习的笔记。
 
     我们知道现在 .NET 就业来看,80% 的 .NET 程序员都是从事 Web 开发,
     如果对微软唯一(现在不唯一了)Web 服务器都不熟的话,那就有点儿尴尬了;(不能被微软宠坏了)
 
     Web 站点性能的好坏不在于 Web 服务器本身,IIS 可以说已经说一款非常强悍的 Web 服务器了。
     现在对 IIS 6.0、IIS 8.5 做一些基本知识的整理;
 
     微软早期在 IIS 上,提出进程池的概念,允许多个 Web 站点运行在一个 IIS 进程池(W3WP.exe)上,怎么说有好有坏,
     好在他节省了 CPU、内存的开销,坏在他进程池的配置非独立,最大问题是某一个 Web 站点挂了,同一个进程次下的站点都会挂掉。
     乃至在 IIS 7+ 以上的版本,默认创建的站点都会是独立的进程池;
 
     Web 服务器其实深入进去也没有什么多神秘的东西,核心取决于你的设计,怎么合理处理请求/响应、并发控制;
 
     // 追评:
          所有的 Web 服务器,无非是对网络层和 HTTP 协议层做了相应的解析处理而已。
 
一、IIS 6.0
     早些年,公司还在一直在使用 IIS 6.0,作为微软早期的版本,那各种安全问题源源不断,此处默哀一下苦逼的程序员
     什么远程代码执行、上传数据流漏洞、身份认证漏洞.... 导致很多 .NET 开发人员觉得 Web 服务器放在 Windows 下就是不安全。
     其实微软背后的团队,已经非常努力的在做补丁和迭代了,
     注意:
     1、服务器上一定不要关闭 Windows Update。
     2、作为一名程序员,有责任关于微软动态、更新稳定的 IIS 版本。
 
     IIS 6.0 由于太老的产品,不做过多的分析。
 
二、IIS 运行过程
     (这样比较好理解,假装自己在写 Web 服务器)
 
     首先,HTTP 请求规范原理、细节不做解释了。
     我们都知道 IIS Web 服务器默认监听 80 端口,那么监听的过程总得需要支撑吧,
     HTTP.sys 组件,它负责监听所有的 HTTP 请求,监听到请求了以后,
     根据请求信息(URL)分配对对应的进程池上(W3WP.exe/Application Pool),进程池完成本次请求处理后进行响应;
     // 在上文简单提到了 IIS 进程池,所有的站点都必要依赖与他,而进程池启动后会产生一个独立的 W3WP.exe 进程
 
     1、HTTP.SYS:(Kernel)的一个组件,它负责侦听(Listen)来自于外部的HTTP请求,根据请求的URL将其转发给相应的应用程序池 (Application Pool)。
          当此HTTP请求处理完成时,它又负责将处理结果发送出去。
          为了提供更好的性能,HTTP.sys 内部建立了一个缓冲区,将最近的HTTP请求处理结果保存起来。
 
     2、Application Pool:IIS 总会保持一个单独的工作进程:应用程序池。所有的处理都发生在这个进程里,包括 ISAPI dl l的执行。
     应用程序池它们允许以更小的粒度控制一个指定进程的执行。
     你可以为每一个虚拟目录或者整个Web 站点配置应用程序池,这可以使你很容易的把每一个应用程序隔离到各自的进程里,
       这样就可以把它与运行在同一台机器上其他程序完全隔离。从 Web 处理的角度看,如果一个进程死掉,至少它不会影响到其它的进程。
    当应用程序池接收到 HTTP 请求后,交由在此应用程序池中运行的工作者进程 Worker Process: w3wp.exe 来处理此HTTP请求。
 
  3、Worker Process: 当工作者进程接收到请求后,首先根据后缀找到并加载对应的 ISAPI 扩展 (如:aspx 对应的映射是 aspnet_isapi.dll ),
       工作者进程加载完 aspnet_isapi.dl l后,由 aspnet_isapi.dll 负责加载 ASP.NET应用程序的运行环境即CLR (.NET Runtime)。
          Worker Proces s运行在非托管环境,而 .NET 中的对象则运行在托管环境之上(CLR),它们之间的桥梁就是 ISAPI 扩展。
 
  4、WAS(Web Admin Service):这是一个监控程序,它一方面可以存取放在InetInfo元数据库(Metabase)中的各种信息,
       另一方面也负责监控应用程序池(Application Pool)中的工作者进程的工作状态况,必要时它会关闭一个老的工作者进程并创建一个新的取而代之。
 
  看图:
       

     
  进程池中 经典管道 ISAPI 的作用、生命周期?
     集成管道中的乞求处置管道怎么理解?
 
 
二、ASP.NET 运行原理(浅析)
 
     看图:
     

   ( AppDomain 运行过程图示)
 
 AppDomain 的作用,相信大家都很了解了吧.这里简明扼要的写几点:
 
 1、一个 AppDomain 中的代码创建的对象不能由另一个 AppDomain 中的代码直接访问(只能使用按引用封送或者按值封送,起到了很好的隔离作用);
 
 2、AppDomain 可以卸载 CLR 不支持从 AppDomain 中卸载一个程序集的能力,但可以告诉 CLR 卸载一个 AppDomain,
      从而达到卸载当前包含在该 AppDomain 内的所有程序集.
 
 3、AppDomain 可以单独保护 当宿主加载一些代码之后,可以保证这些代码不会被破坏(或读取)宿主本身使用的一些重要的数据结构.。 
 
 4、AppDomain 可以单独配置 设置主要影响 CLR 在 AppDomain 中加载程序集的方式,涉及搜索路径、版本绑定重定向、卷影复制及加载器的优化。
 
 由以上几点可以看出 AppDomain 确保了 Windows 系统及其中运行的应用程序的健壮性。AppDomain 提供了保护、配置和终止其中每一个应用程序所需的隔离性。
 
 
   再来看下 ProcessRequest 的过程:
   

 简单分析一下上图
 
 ProcessRequest(HttpWorkerRequest wr)中判断 wr 是否为 null,然后判断管线是否完整,再调用 ProcessRequestNoDemand(wr) 方法,
 并判断当前 RequestQueue 是否为 null,接着计算等待时间并更新管线数 CalculateWaitTimeAndUpdatePerfCounter(wr);
 重置 wr 开始时间 wr.ResetStartTime();调用 ProcessRequestNow(wr) 方法,并调用 ProcessRequestInternal(wr) 方法;
 

 
 到这里想必能够使大家对ASP.NET管道机制能够有一个简单的回顾.当然还有很多地方没有详细分析。
 再来总结一下IIS运行过程及ASP.NET管道机制:
 
     Request→ (Internet ) HTTP.sys 监听
     → WAS (IIS6 web Admin Service /IIS7 (Windows Activation Service) 接收请求
     → (传入)Application Pool's → w3wp.exe(检查URL后缀)
     → (加载)ISAPI扩展[aspnet_isapi.dll] → 注册映射 构造HttpRuntime类
     →ProcessRequest方法  HttpContext实例产生(Request,Response,Session and so on…)
 
 HttpRuntime 调用 HttpApplicationFactory加载HttpApplication对象
 
 穿越HttpModule到达HttpHandler
 
 简单用140个字符(即一条微博的字数)概括:
 
 Request→ (Internet ) HTTP.sys →(WAS)→Application Pool's → w3wp.exe→ISAPI→ Map→   (Pipeline)        
 HttpWorkerRequest→AppDomain→HttpRuntime→ProcessRequest()→ HttpContext(Request,Response)
  → HttpRuntime→HttpApplicationFactory→HttpApplication→ HttpModule→HttpHandler→EndRequest

IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转的更多相关文章

  1. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

     前言:      记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别?      促使我对进程池进了知识的学习,所以记录一下学习 ...

  2. ASP.NT运行原理和页面生命周期详解及其应用

    ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用.  ...

  3. 支持10W高并发请求的IIS Web服务器常用设置

    支持高并发的IIS Web服务器常用设置   适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows ...

  4. ASP.NET运行原理

    1,ASP.NET运行原理: 客户端向服务器发出请求 → 服务器处理请求→ 处理好的数据以报文发给浏览器 → 浏览器显示请求结果 2,Chrome浏览器,查看请求过程:F12打开浏览器的调试窗口: 3 ...

  5. 在 Azure 中的 Windows 虚拟机上使用 SSL 证书保护 IIS Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Windows ...

  6. 配置IIS Web服务器

    配置IIS Web服务器 1.1 控制面板中找到“程序”并打开 1.2 程序界面找到“启用或关闭Windows功能”并打开 1.3 上面两步也可以简化为一步:按[Win + R]快捷键打开运行对话框, ...

  7. 项目()已配置为使用IIS Web服务器,但此计算机上...

    问题:x 就是要将一个项目,配置在IIS上,以前没遇上过这种开发模式啊... 解决方案: 0.如果配置为不使用IIS Web服务器,将Project.csproj中的" <UseIIS ...

  8. IIS Web服务器日志、日志服务器分析

    IIS Web服务器日志.日志服务器分析 EventLog Analyzer是一款全面的工具,用于审计.管理和跟踪您的Microsoft Internet Information Services(I ...

  9. ASP.NET运行原理_2

    当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的页面类型为其加载相应的.dll文件,然后在处理过程中将这条请求发送给能够处理这个请求的模块.在ASP.NET 3.5中,这个模 ...

随机推荐

  1. java.lang.NoClassDefFoundError: com/gexin/rp/sdk/exceptions/RequestException解决方法

    本文为博主原创,未经允许不得转载: 最近在开发个推的时候遇到的问题,当我在maven仓库中下载个推的jar包时,下载不下来,索性在项目中Configue build Path,将jar下载到本地 手动 ...

  2. 3、Ansible playbooks(Hosts、Users、tasks、handlers、变量、条件测试(when、迭代)、templates)

    Ansible playbooks playbook是由一个或多个“play”组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲 ...

  3. 1、Python模块和包(0602)

    模块.异常.运行环境.mysqldb 模块: 顶层文件:作为整个文件的程序入口,就是负责去调用其他文件中的代码来实现程序流程功能的,称为顶层程序文件, 模块文件1 模块文件2 python模块 1.可 ...

  4. HDU 6203 ping ping ping(dfs序+LCA+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连 ...

  5. js之鼠标随动后面跟随事件(类似于长龙跟着跑)

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. 理解 Redis(7) - Set 值

    unordered collection of unique strings.set值是唯一的字符串的无序集合, 把握住两个特点: 唯一, 无序. 清空所有的数据, 并清理显示界面: 127.0.0. ...

  7. 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础

    在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...

  8. CZK 的饮料店

    [题目描述] 一天,小学生 cyx 向你请教了一道他不会做的小学数学题,你瞄了一眼题目,发现题目长下面这样. czk 老板开了个饮料连锁店,连锁店共有 n 家,出售的饮料种类相同. 为了促销,czk ...

  9. python的json模块的dumps,loads,dump,load方法介绍

    dumps和loads方法都在内存中转换, dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而load是从一个文件中读取字符串 将列表转为字符串 >>&g ...

  10. spring mvc 形参类型

    spring mvc 形参类型 1 没有占位符号的,形参的名字为参数的名称 请求路径为:organtrans/t1/t5?a=1(a为形参的的名称必须一致) @RequestMapping(" ...