之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解。

本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过程。我们从ASP.NET站点的一个页面请求开始说起,先看下面对于某个请求的简单执行模型

(注意这是对asp.net站点Index.aspx页面的第一次请求,所以需要进行动态编译):

我们通过ASP.NET的执行模型简单的描述了一次web请求过程,注意在不同的IIS版本中,处理模型和通信方式是不一样的,在IIS7.0以上asp.net已经作为一个模块集成在了IIS中。

我们继续对上面的流程进行相关阐述:

  1. 首先我们通过浏览器发送页面请求至IIS服务器,由于是第一次请求index.aspx,IIS会将请求转交给ASP.NET后进入编译期(加载aspnet_isapi.dll)
  2. 由于ASP.NET是通过CLR运行,而CLR只认识MSIL(微软中间语言),所以ASP.NET会判断代码是否已被编译,若未被编译则会走二次编译流程,否则跳过编译进入执行期,
  3. 在执行期进行一系列的模块处理,然后返回请求

接着我们来看看什么是二次编译?

二次编译:

将源代码文件通过编译器编译成中间语言代码和元数据,执行时再编译为本地机器语言代码的过程。

感觉不好理解?那就直接看图吧!

如上,我们把这两次编译的过程叫做二次编译。

二次编译在站点页面首次被请求时执行,ASP.NET判断已经编译过的不会再走编译流程。

看完二次编译然后我们再对asp.net站点Index.aspx进行首次请求:
用户请求—>IIS服务器—>ASP.NET—>二次编译—>MSIL(代码编译器)—>本机语言(JIT)—>执行期

  1. 创建应用程序域
  2. 初始化核心对象
  3. 启动应用程序
  4. 根据配置对请求进行处理,一系列HTTPModule和HTTPHandler

最后请求通过一层层HttpModule和HttpHandler后进入页面的初始化,加载,呈现,用户操作,卸载。

这就解释了为什么我们的站点页面第一次被请求的时候总是慢一点的原因,原因就是第一次请求时走了编译的过程,加载了一系列初始化的东西。

如果我有多个应用程序池多个站点都部署在一台IIS服务器,我发一个请求IIS如何知道我请求的是哪个呢?这里就会提到到一个HTTP.SYS组件。

其实在IIS将请求交给ASP.NET之前,会最先触发HTTP.SYS的响应,由HTTP.SYS负责把请求传入相应的应用程序池。然后继续走上面的ASP.NET流程
每当创建一个应用程序池,该池的ID就会生成并在HTTP.SYS文件中注册。

总结:

如上图:在执行期会进行一系列的操作,然后通过HttpModule模块到达HttpHandler处理程序,最后开始进入页面的生命周期相关的东西。

看完如果对你有帮助还可关注公众号CodeL获取更多内容。

ASP.NET执行模型之IIS服务器处理流程的更多相关文章

  1. IIS 之 Web 服务器上的 ASP.NET 进程模型设置

    配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置. processModel 节只能在 Machine.config 文件中进行设置, ...

  2. IIS 内部运行机制及Asp.Net执行过程详解

    一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...

  3. WebForm ASP开发方式、 IIS服务器以及WebForm开发基础

    网页端 B/S两种:(ASP.NET  --网站应用开发技术) WebForm:  微软最先出现的网站开发技术 MVC:  后来开发,为了让java.PHP转过来的开发人员更容易接受使用 客户端 C/ ...

  4. 配置asp.net IIS服务器遇到的问题以及详细图例解决方案

    原来配置过IIS服务,但是没有将自己的程序放在IIS服务器上,今天突发奇想,看看自己写的程序怎么样啊,能否在服务器上运行一下,说干就干,但是遇到了很多困难,今天把陪孩子过程以及遇到的问题给大家说说,希 ...

  5. 注册asp.net 4.0版本到IIS服务器中

    在IIS服务器的运维的过程中,有时候部署asp.net网站发现未安装.net framework对应版本信息,此时就需要重新将.net framework对应的版本注册到IIS中,此处以重新注册.ne ...

  6. [ASP.net教程]IIS服务器 远程发布(Web Deploy)配置

    asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的文件到服务器硬盘上.打包成安装程序到服务器上安装.通过Visual Studio 开发平台远程发布到服务器. 在asp.net网站的 ...

  7. ASP.NET Core WebApi 项目部署到 IIS 服务器的总结

    Point: - ASP.NET Core WebApi 项目 - 发布到 IIS 服务器 1. 选择 File System 2. 输入要发布到的路径 # 其它默认,直接发布 3. 打开 IIS,添 ...

  8. ASP.NET路由模型解析

    大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...

  9. processModel与ASP.NET进程模型

    配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置.其作用是配置IIS或IIS中的应用程序池(IIS7及以后版本)的安全性,性能,健壮性 ...

随机推荐

  1. PHP5 各版本维护时间

    版本维护: 5.2:维护至:2011-01-06.支持:xp(2003)以上.最终版本:5.2.17. 5.3:维护至:2014-08-14.支持:xp(2003)以上.最终版本:5.3.29 5.4 ...

  2. jquery messagetip信息语提示控件

    编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺 ...

  3. jquery取消事件冒泡的三种方法(推荐)

    1.通过返回false来取消默认的行为并阻止事件起泡. jQuery 代码: ? 1 2 3 4 5 6 7 8 9 10 11 $("form").bind(   "s ...

  4. [ACM] 1007 -球球方格

    与兔子方格类似,不过一秒走一格: 输入 代码 #include<iostream> using namespace std; int main(void) { int test_count ...

  5. Sql Server 2008 数据库附加失败提示9004错误解决办法

    附加数据库 对于 服务器“WSS_Content”失败.  (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlS ...

  6. 微信公众号里打开链接下载APP

    嵌入这样的代码 <a href="http://a.app.qq.com/o/simple.jsp?pkgname=com.violationquery" target=&q ...

  7. setTimeout和setInterval

    setTimeout(methodName, interval); //间隔时间单位为毫秒,表示interval毫秒后执行方法methodName setInterval(methodName, in ...

  8. 【代码笔记】iOS-调用系统震动和声音

    代码: RootViewController.m #import "RootViewController.h" #import <AudioToolbox/AudioTool ...

  9. Moinmoin wiki 中文附件名的解决办法

    参考: 让MoinMoin支持上传中文文件名的附件 http://www.linuxsir.org/bbs/thread368571.html 在1.9.7中修改解决.   MOINMOINWIKI1 ...

  10. asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config

    从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了 [App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleCon ...