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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Http请求处理流程

从一个页面比如www.xuxiaoyu.net的请求开始如何就能打开blogs页面的呢?这其中发生了什么样的东西? Http请求(Http Request) 当服务器(IIS)接受到一个Http请求的时候进行以下步骤的处理: 1)服务器获取所请求的页面的后缀…

iis到w3wp的数据流及工作原理

HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析

演示地址:如有演示站请以演示为准,无演示站以截图为准,源码太多服务器有限,无法搭建所有源码演示站,请谅解!新手购买指导:1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

php version.,PHP_VERSION指什么

PHP_VERSION (string)当前的PHP版本&#xff0c;以字符串形式“ major.minor.release [extra]”表示。 (推荐学习&#xff1a;PHP视频教程)例如&#xff1a;<?php // PHP_VERSION_ID 自 PHP 5.2.7 起有效&#xff0c;// 如果我们的版本低于该版本&#xff0c;则用以下代码来…

C# async 和 await 理解

先假设如下场景&#xff1a; 主函数 Main&#xff0c;循环等待用户输入&#xff1b; 计算函数 Cal&#xff0c;耗时计算大量数据&#xff1b; class Test {static int Main(string[] args){while(true){// 等待用户输入}}public static int Cal() {int sum 0;for (int i …

C# 彻底搞懂async/await

前言 Talk is cheap, Show you the code first&#xff01; private void button1_Click(object sender, EventArgs e) {Console.WriteLine("111 balabala. My Thread ID is :" Thread.CurrentThread.ManagedThreadId);AsyncMethod();Console.WriteLine("222 …

c#之task与thread区别及其使用

1.什么是thread 当我们提及多线程的时候会想到thread和threadpool&#xff0c;这都是异步操作&#xff0c;threadpool其实就是thread的集合&#xff0c;具有很多优势&#xff0c;不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程&#xff0c;主程序必须等…

java内存分配和垃圾回收,Java内存分配与垃圾回收

1.JVM管理的内存包含下图所示的几个运行时数据区域&#xff0c;其中方法区和堆为线程共享的数据区域&#xff0c;程序计数器&#xff0c;虚拟机栈以及本地方法栈为线程私有的数据区域。程序计数器&#xff1a;可以看做是当前线程所执行的字节码的行号指示器&#xff0c;告诉字节…

谈谈你对闭包的理解?

闭包这个概念好难理解&#xff0c;身边朋友们好多都稀里糊涂的&#xff0c;稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下&#xff0c;如果在一个函数的内部定义了另一个函数&#xff0c;外部的我们叫他外函数&#xff0c;内部的我们…

php有哪些开源社区,PHP开源社区

简介Blade 是 Laravel 提供的一个简单而又强大的模板引擎。和其他流行的 PHP 模板引擎不同&#xff0c;Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来&#xff0c;除非它被修改&#xff0c;否则不会重新编译&#xff…

GetType和typeof的区别

typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符&#xff0c;获得某一类型的 System.Type 对象。 Type t typeof(int); GetType: Gets the Type of the current instance. 方法&#xff0c;获取当前实例的类型。 int i 10; Consol…

php新手用7.2,总结PHP升级7.2之后需要注意的事情

最近升级了PHP版本&#xff0c;从7.1升级到7.2&#xff0c;升级前版本&#xff1a;PHP 7.1.14 (cli) (built: Feb 2 2018 08:42:59) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.1.14…

第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

一. 背景 说起EF的增删改操作&#xff0c;相信很多人都会说&#xff0c;有两种方式&#xff1a;① 通过方法操作 和 ② 通过状态控制。 相信你在使用EF进行删除或修改操作的时候&#xff0c;可能会遇到以下错误&#xff1a;“ The object cannot be deleted because it was n…

第十六节:语法总结(3)(C#6.0和C#7.0新语法)

一. C# 6.0 新语法 1. 自动属性初始化可以赋值 1 /// <summary>2 /// 自动属性初始化3 /// </summary>4 public class UserInfor5 {6 public string userId { get; set; } "123456";7 8 public string userName {…

php仿伊人集源码,仿伊人集wecenter()包含所有功能及官方付费插件,整站带数据...

演示地址&#xff1a;如有演示站请以演示为准&#xff0c;无演示站以截图为准,源码太多服务器有限&#xff0c;无法搭建所有源码演示站&#xff0c;请谅解&#xff01;新手购买指导&#xff1a;1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

第十七节:易混淆的概念(静态和非静态、拆箱和装箱)

一. 静态和非静态 1. 概念介绍 ① 静态类&#xff08;被static修饰&#xff09; vs 普通类&#xff08;没有被static修饰&#xff09; ② 静态成员&#xff1a;被static修饰的成员&#xff0c;比如&#xff1a;静态方法、静态字段等 ③ 普通成员(实例成员)&#xff1a;不被st…

perl连接oracle的方法,Perl 连接Oracle 数据库

1.安装DBI和DBD::Oracle 模块。下载地址&#xff1a;搜索DBI&#xff0c;DBD::Oracle如果你的linux可以连接网络&#xff0c;执行命令&#xff1a;#wget#wget下载到当前目录。2.安装这里主要都是源码安装。解压到目录&#xff1a;DBI-1.622#tar –zxvf DBI-1.622.tar.gz安装可…

第十八节:跨域请求的解决方案和WebApi特有的处理方式

一. 简介 前言&#xff1a; 跨域问题发生在Javascript发起Ajax调用&#xff0c;其根本原因是因为浏览器对于这种请求&#xff0c;所给予的权限是较低的&#xff0c;通常只允许调用本域中的资源&#xff0c; 除非目标服务器明确地告知它允许跨域调用。假设我们页面或者应用已在 …

ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在&#xff08;2018年&#xff09;&#xff0c;大约有六年时间了&#xff0c;最初阶段连接数据库&#xff0c;使用的是【SQL语句ADO.NET】&#xff0c;那时候&#xff0c;什么存储过程、什么事务 统统不理解&#xff0c;生硬的将SQL语句传入SQL…

oracle 9i 只读模式,我的oracle 9i学习日志(6)--Starting Up and shutting down a Database

Starting Up a Database1、NOMOUNT这个状态下oracle server完成下列任务&#xff1a;a.读取初始化参数文件&#xff1b;b.为SGA分配内存&#xff1b;c.启动后台进程&#xff1b;d.打开alertSID.log文件和跟踪文件数据库必须被命名&#xff0c;即初始化文件或在startup命令里指定…