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工作原理的更多相关文章

  1. iis 站点中文乱码 解决方案

    问题描述:iis乱码问题 1:在vs里开发没问题,发布后用发布文件替换iis文件没问题,但是如果用fis3发布后导致iis站点访问时出现部分中文乱码 原理:文件编码格式不统一 解决方案: 四个步骤解决 ...

  2. JavaWeb与Asp.net工作原理比较分析

    一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...

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

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...

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

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

  5. IIS 6.0的web园 最大工作进程数细谈

    这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下:(摘自:http://www.jb51.net/article/84817.htm) IIS 6.0允许将应用程序池配 ...

  6. 自动发布-asp.net自动发布、IIS站点自动发布(集成SLB、配置管理、Jenkins)

    PS:概要.背景.结语都是日常“装X”,可以跳过直接看自动发布 环境:阿里云SLB.阿里云ECS.IIS7.0.Jenkins.Spring.Net 概要 公司一个项目从无到有,不仅仅是系统从无到有的 ...

  7. IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解

    IIS:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池 ...

  8. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  9. 开源的asp.net工作流程引擎。 http://ccflow.org

    开源的asp.net工作流程引擎. http://ccflow.org

随机推荐

  1. linux下json工具jq

    1.查看json文件 [root@VM-1-10-11 f46c19f56252a74a46fd30026001e62cc5ecadd04bc9a80c47f6fd5f9dc0586b]# pwd / ...

  2. 浏览器唤起APP的思路(本文转载)

    在做 h5 页面中,会遇到这样一个需求,有一个立即打开的按钮,如果本地安装了我们的 app,那么点击就直接唤起本地 app,如果没有安装,则跳转到下载. 首先想到的是两个问题:一是如何唤起本地 app ...

  3. C#中的 new Random()

    在C#中,产生随机数常用大方法是 new Random().Next(1,10)等方法. 但是仔细发现会有个问题: 看代码: ; i < ;i++ ) { Console.WriteLine(, ...

  4. C# DataTable To Entities

    原地址忘了,修改过了一下. new: public static class DataTableEntityInteroperate { public static List<T> ToE ...

  5. tf.Variable和tensor的区别(转)

    刷课过程中思考到Variable和Tensor之间的区别,尝试发现在如下代码中: a = tf.Variable(tf.ones(1)) b = tf.add(a,tf.ones(1)) 1 2 a是 ...

  6. 使用RestTemplate调用接口上传文件

    场景 接口接受一个文件,缓存在本地,验证文件的完整性及内容,然后将文件上传至云服务器: 下面只写利用RestTemplate将文件上传至云服务器,至于文件上传以及缓存在本地可以参考:JAVA文件上传: ...

  7. Struts 框架

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  8. 小程序-setData

    根据下标修改数组中的key: var id = e.target.id//根据点击不同的view获取对应的id值 var str = "isChecked[" + id + &qu ...

  9. yum update 自动忽略内核更新

    系统每天凌晨 3 点自动执行 yum update 任务 但升级内核后,会出现下面情况 一些编译软件需要内核模块才能够被调用, 而内核模块需要与当前版本内核编译后才能够使用, 假设内核升级后,之前软件 ...

  10. 健壮的网络编程IO函数-RIO包

    RIO包 简介 Rio包即为Robust io函数包.包中函数是对Linux基本I/O函数的封装,使其更加健壮.高效,更适用于网络编程. 分析 Rio包由rio_t结构体和系列函数组成. 首先是两个不 ...