IIS站点工作原理与ASP.NET工作原理
IIS站点工作原理与ASP.NET工作原理
一、IIS
IIS 7.0工作原理图
两种模式:
1、用户模式(User Mode)(运行用户的程序代码。限制在特定的范围内活动、有些操作必须要受到Kernel Mode的检查才能执行)
2、内核模式(Kernel Mode)(运行系统代码。)
参考文档:
http://blog.csdn.net/zhuxiaoyang2000/article/details/8052324
Http.sys是Microsoft Windows处理HTTP请求的内核驱动程序,这个东西运行在Kernel Mode模式下。
1、在OS启动的时候,IIS会把可以访问的路径注册到HTTP.SYS里面,在HTTP.SYS内部形成一个MAP,HTTP.SYSY截获请求之后根据MAP指向相对应的Application POOL(如果URL不存在映射,直接指向404)
2、Application POOL根据ISAPI的MAP(如下图)找到对应的处理程序(实际就是扩展名和处理程序的一个MAP)
3、如果在IISAPI MAP当中找不到,看是否是被保护的文件(比如:APP_CODE文件夹,.DLL文件)。如果是被保护的拒绝。
4、没有被保护,也没有找到对应的处理程序,则直接返回文件给客户端
经典模式和集成模式(这个地方在管道地方讲)
二、HOSTING(宿主)
ASP.NET就是一个程序包,当HTTP请求的时候,入口点就是HttpRuntime
public static void HttpRuntime.ProcessRequest(HttpWorkerRequest wr){}
ProcessRequest用来处理所有请求的信息、所请求的文件、服务器端变量、QueryString、Http 头信息。最后输入流(html)给客户端
每个程序(程序池)实际上是运行在各自的进程中(w3wp.exe),这样当程序有任何的变动(web.config、dll、错误崩溃等)可以相互不影响
1、HTTP.SYS接收请求
2、HTTP.SYS将请求交给IISAPI
3、IISAPI从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中
4、在相互隔离的应用程序域AppDomain(在这里面是进程)中加载HttpRuntime。
5、调用 HttpRuntime的ProcessRequest方法。 将3的HttpWorkerRequest 交给ProcessRequest
6、这个地方处理程序员的代码
7、IIS把返回的数据流(HTML静态页面)交给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。
三、Pipeline 管道
首先声明三个概念:ASP.NET应用程序生命周期(宏观)、 ASP.NET页生命周期(http://msdn.microsoft.com/zh-cn/library/ms178472(v=vs.100).aspx)(中观)、控件生命周期(微观)
“管道模式”针对ASP.NET应用程序生命周期而言,区分为 经典模式和集成模式。
经典模式原理图(实际就是IIS6的原理图,IIS7为了兼容,减少升级成本)
集成模式原理图
从两张图的对比当中我们可以看出,IIS6对各种处理程序(html,php,asp,aspx等,都是以扩展的形式来外挂到IIS6当中。它们的地位是平等的),但是在IIS7当中,ASPNET_ISAPI被集成到IIS当中。这样所有的程序(HTML,PHP,ASPX,ASP,JSP等都可以共同享受.NET的各种功能,比如缓存机制,验证机制等)
从图中我们可以对HTML文件一样有效
当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。
1、Handlers只有一个。Modules有多个。
注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。
HttpModule
HTTP模块是实现了System.Web.IhttpModule接口的类。
IHttpModule接口的声明:
public interface IHttpModule
{
void Init (HttpApplication context);
void Dispose ();
}
Init 方法:系统初始化的时候自动调用,这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。
Dispose方法: 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。
HTTP模块可以向System.Web.HttpApplication对象注册下面一系列事件:
AcquireRequestState 当ASP.NET运行时准备好接收当前HTTP请求的对话状态的时候引发这个事件。
AuthenticateRequest 当ASP.NET 运行时准备验证用户身份的时候引发这个事件。
AuthorizeRequest 当ASP.NET运行时准备授权用户访问资源的时候引发这个事件。
BeginRequest 当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件。
Disposed 当ASP.NET完成HTTP请求的处理过程时引发这个事件。
EndRequest 把响应内容发送到客户端之前引发这个事件。
Error 在处理HTTP请求的过程中出现未处理异常的时候引发这个事件。
PostRequestHandlerExecute 在HTTP处理程序结束执行的时候引发这个事件。
PreRequestHandlerExecute 在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序。
PreSendRequestContent 在ASP.NET把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。
PreSendRequestHeaders 在ASP.NET把HTTP响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前,这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie和自定义数据。
ReleaseRequestState 当ASP.NET结束所搜有的请求处理程序执行的时候引发这个事件。
ResolveRequestCache 我们引发这个事件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的。
UpdateRequestCache 当ASP.NET完成了当前的HTTP请求的处理,并且输出内容已经准备好添加给输出缓冲的时候,引发这个事件。这依赖于Web应用程序的输出缓冲是如何设置的。
上面这么多的事件,我们看起来可能会有些眼晕,但没关系,下面一步一步地看。
HttpModule生命周期示意图
下面是事件的触发顺序:
BeginRequest和PreRequestHandlerExecute之间的事件是在服务器执行HttpHandler处理之前触发。
PostRequestHandlerExecute和PreSendRequestContent之间的事件是在服务器执行Handler处理之后触发。
HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
本文的重点不是详细介绍如何使用管道,如何使用更详细的 HTTPMODULE和HTTPHANDLER 请参考(http://www.cnblogs.com/chenlulouis/archive/2009/12/18/1626918.html)
参考文档:
http://www.cnblogs.com/isdavid/archive/2013/05/28/3103228.html
http://blog.csdn.net/fion45/article/details/11592355
http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html
http://www.cnblogs.com/Joans/archive/2012/02/02/2335537.html
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IIS%E7%AB%99%E7%82%B9%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&oq=asp.net%20%E5%8E%9F%E7%90%86&rsv_pq=90c2d9c60009de34&rsv_t=d22cX5FGlDjDQAVk4LxnJbUMHja9pe0wZOLtAQxDHjGs0VKNUa7Ag1ZHGg0&rsv_enter=0&inputT=666&rsv_sug3=40&rsv_sug1=25&rsv_sug7=100&rsv_n=2&bs=asp.net%20%E5%8E%9F%E7%90%86
IIS站点工作原理与ASP.NET工作原理的更多相关文章
- iis 站点中文乱码 解决方案
问题描述:iis乱码问题 1:在vs里开发没问题,发布后用发布文件替换iis文件没问题,但是如果用fis3发布后导致iis站点访问时出现部分中文乱码 原理:文件编码格式不统一 解决方案: 四个步骤解决 ...
- JavaWeb与Asp.net工作原理比较分析
一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转
转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 前言: 记录 IIS 相 ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理
前言: 记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别? 促使我对进程池进了知识的学习,所以记录一下学习 ...
- IIS 6.0的web园 最大工作进程数细谈
这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下:(摘自:http://www.jb51.net/article/84817.htm) IIS 6.0允许将应用程序池配 ...
- 自动发布-asp.net自动发布、IIS站点自动发布(集成SLB、配置管理、Jenkins)
PS:概要.背景.结语都是日常“装X”,可以跳过直接看自动发布 环境:阿里云SLB.阿里云ECS.IIS7.0.Jenkins.Spring.Net 概要 公司一个项目从无到有,不仅仅是系统从无到有的 ...
- IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
IIS:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池 ...
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- 开源的asp.net工作流程引擎。 http://ccflow.org
开源的asp.net工作流程引擎. http://ccflow.org
随机推荐
- HTML5的新标签之一的Canvas
一. <canvas>简介(了解) 1. 什么是canvas: 是HTML5提供的一种新标签 <canvas></canvas> 英 ['kænvəs] 美 [ ...
- python中的matplotlib的一些基础用法
#绘制折线图或者散点图plot import matplotlib.pyplot as pyl import numpy as npy x = [1,2,3,4,8] y = [5,7,2,1,5] ...
- 使用Fiddler远程抓包(转载)
转载自 http://www.cnblogs.com/111testing/p/6436372.html Fiddler简介以及web抓包 一.Fiddler简介 简单来说,Fiddler是一个htt ...
- oracle 函数的返回值与out参数
函数的return值是调用函数返回的结果. 而out参数就是单纯的赋值. 例子: function test(aaa in varchar, bbb out integer) return integ ...
- defer和async的详细区别
看过javascript高级程序设计的人,在javascript高级程序设计里,应该看到了介绍了有关defer和async的区别,可是比较浅显,而且也说得不是很清楚.下面我们来通过图片来详细了解下df ...
- sqoop2 缺少 jackson-core-asl-1.8.8.jar 和 jackson-mapper-asl-1.8.8.jar 这两个jar包
[root@spark2 client]# cat /var/log/sqoop2/localhost.2017-12-22.log 十二月 22, 2017 10:29:17 上午 org.apac ...
- 旋转数组的最小数字(python)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- WAS 忘记密码
一.重置密码 1.首先关闭was,ps –ef|grep java 查看java进程号,然后kill -9 XXXX杀掉进程即可.或者使用命令./stopServer.sh server1 2.取消控 ...
- e-olymp Problem11 Big accuracy
传送门:点我 Big accuracy The rational fraction m/n is given. Write it in the decimal notation with k digi ...
- TOJ3216 我要4444
传送门 http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3216 时间限制(普通/Java) ...