转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. 51nod P1305 Pairwise Sum and Divide ——思路题

    久しぶり! 发现的一道有意思的题,想了半天都没有找到规律,结果竟然是思路题..(在大佬题解的帮助下) 原题戳>>https://www.51nod.com/onlineJudge/ques ...

  2. s*s*r备用

    遇见的问题 突然打不开 ip被墙 能ping 但是不能ssh 参考https://www.vultrcn.com/6.html

  3. 基于SVM的python简单实现验证码识别

    验证码识别是一个适合入门机器学习的项目,之前用knn 做过一个很简单的,这次用svm来实现.svm直接用了开源的库libsvm.验证码选的比较简单,代码也写得略乱,大家看看就好. 1. 爬取验证码图片 ...

  4. Java常见异常:Exception in thread "main" java.lang.NoClassDefFoundError

    在某一路径下执行编译好的class文件出错. 异常如下: E:\liwy>java Test98 Exception in thread "main" java.lang.N ...

  5. 更新:在MAC上安装RN开发环境的步骤(全)

    总共分为三部: 1:按照官网(中文)上的步骤去安装jdk和android studio 2:配置SDK 3:安装虚拟机和模拟器 所以这里提出的是注意事项: 1:~/.bash_profile 文件里面 ...

  6. 利用React Native 从0到1 开发一款兼容IOS和android的APP(仿造京东)

    最近有一部电视剧叫做<微微一笑很傻逼>里面有个男猪脚,人们都叫他大神~我觉得吧~大神是相对的~所以~啥事都得谦虚! 好了 今天介绍的是如何从0到1利用React Native开发一款兼容I ...

  7. python 比较两个yaml文件

    import yaml with open("a.yaml") as f: with open("a.yaml") as k: ): x=f.readline( ...

  8. CentOS7下搭建LAMP+FreeRadius+Daloradius Web管理

    注意:本文所有命令均在root命令下执行. freeradius服务官网:http://freeradius.org/ daloradius Web管理页面官网:https://sourceforge ...

  9. Python 模块(module)

    模块(module)也是为了同样的目的.在Python中,一个.py文件就构成一个模块.通过模块,你可以调用其它文件中的程序. first.py def laugh(): print "Ha ...

  10. strip函数

    f=open('a.txt',)for l in f.readlines(): print(l.strip())  # 默认清除字符串l的首尾位的\n或空格,如果是l.strip("a&qu ...