IIS站点工作原理与ASP.NET工作原理

时间:2023-03-09 15:14:53
IIS站点工作原理与ASP.NET工作原理

IIS站点工作原理与ASP.NET工作原理

 一、IIS

IIS 7.0工作原理图

IIS站点工作原理与ASP.NET工作原理

两种模式:

1、用户模式(User Mode)(运行用户的程序代码。限制在特定的范围内活动、有些操作必须要受到Kernel Mode的检查才能执行)

2、内核模式(Kernel Mode)(运行系统代码。)

参考文档:

http://blog.****.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)

IIS站点工作原理与ASP.NET工作原理

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、错误崩溃等)可以相互不影响

IIS站点工作原理与ASP.NET工作原理

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 再将这些数据返回给客户端浏览器。

IIS站点工作原理与ASP.NET工作原理

三、Pipeline 管道

首先声明三个概念:ASP.NET应用程序生命周期(宏观)、 ASP.NET页生命周期(http://msdn.microsoft.com/zh-cn/library/ms178472(v=vs.100).aspx)(中观)、控件生命周期(微观)

“管道模式”针对ASP.NET应用程序生命周期而言,区分为 经典模式和集成模式。

经典模式原理图(实际就是IIS6的原理图,IIS7为了兼容,减少升级成本)

IIS站点工作原理与ASP.NET工作原理

集成模式原理图

IIS站点工作原理与ASP.NET工作原理

从两张图的对比当中我们可以看出,IIS6对各种处理程序(html,php,asp,aspx等,都是以扩展的形式来外挂到IIS6当中。它们的地位是平等的),但是在IIS7当中,ASPNET_ISAPI被集成到IIS当中。这样所有的程序(HTML,PHP,ASPX,ASP,JSP等都可以共同享受.NET的各种功能,比如缓存机制,验证机制等)

IIS站点工作原理与ASP.NET工作原理

从图中我们可以对HTML文件一样有效

当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。

1、Handlers只有一个。Modules有多个。

IIS站点工作原理与ASP.NET工作原理

注意:在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生命周期示意图

IIS站点工作原理与ASP.NET工作原理

下面是事件的触发顺序:

IIS站点工作原理与ASP.NET工作原理

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.****.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