- 浏览: 279970 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
JQ_AK47:
谢谢你的ANT 五篇博文让我对Ant了解入门。
用Ant实现Java项目的自动构建和部署(4) -
lanluo:
这个源码,能给我一份吗?
自定义标签感想 -
mapeijie888:
google 翻译 用的不错
AMF使用简介 -
满分水:
如果有看到,讲解一下,谢谢!
IIs工作原理 -
满分水:
想了解一下IIS服务器是怎样与我们的web应用程序间交互的,终 ...
IIs工作原理
引言
我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net。他们耐心、细致地告诉你如何一步步拖放控件、设置控件属性、编写CodeBehind代码,以实现某个特定的功能。
这种做法,实际上是回答了“如何去做”的问题,却没有回答“为什么可以这样做”的问题。
尽管我很推崇 悉江华 先生的《圣殿祭祀的Asp.Net开发详解》一书,但当我翻看了一下其对角色(Role) 和 用户(Member)的讲解时,我决定跳过去直接读后面的章节。因为我发现他也随了大流,对这部分的讲解停留在“如何去做”的层面上。我相信像悉先生 这样的牛人是不可能不了解底层运作原理的,仅仅是因为那本书原本就已经很厚了吧。
当你按“如何去做”所讲解的内容去开发程序的时候,对于你的用户,你仍是一名程序员;但对于实现了MembershipProvider 和 RoleProvider 抽象类的微软开发人员来说,你已经成了他们的一个用户。
你可能觉得了解这些幕后工作是如何运作的无关紧要,作为程序员的你只要保证开发出的程序可以高效地运行就可以了。然而,在开发过程中,你却发现常常需要使用诸如 HttpContext 这样的类。这个时候,你可曾思考过这些类的构成和类的实体是如何创建的?你可能简单地回答:HttpContext代表当前请求的一个上下文环境。可你又知道IIS 、Framework、Asp.Net 是如何协同工作处理每个Http请求、如何区分不同的请求、IIS、Framework、Asp.Net三者之间的数据如何流动么?
回答上面这些问题,首先需要了解IIS是如何处理页面请求的,这也是理解 Form验证模式和Windows 验证模式 的基础。
Http请求刚刚到达服务器的时候
当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(NOTE:服务器处理一个.htm页面和一个.aspx页面肯定是不一样的么)。那IIS依据什么去处理呢?―― 根据文件的后缀名。
服务器获取所请求的页面(NOTE:也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。
能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。
让我们更进一步地看一下 ISAPI ,看看它到底是什么样子,请按下面的步骤进行:
- 打开IIS。
- 选择随意一个站点,鼠标右键,“属性”。
- 选择“主目录”选项卡。
- 选择“配置”。
你应该会看到如下的画面:
图1. 应用程序配置
很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。
我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:
图2. 编辑.aspx文件的处理程序
一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。现在我们应该知道:Asp.Net 只是服务器(IIS)的一个组成部分而已,它是一个 ISAPI扩展。
这里需要注意两点:
- 当你修改“限制为”后,可以限制页面(文件)只能以某种特定方式访问
- “确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。
理解宿主环境(Hosting)
从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。
NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。
对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。
如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。
每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。
接下来进行的事情就是上一章节讲述的 ISAPI 了。
除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:
- 从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
- 在相互隔离的应用程序域AppDomain中加载HttpRuntime。
- 调用 HttpRuntime的ProcessRequest方法。
接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。
OK,现在你看到张子阳的空间主页了。
图3.Asp.Net 的宿主环境
理解管道(Pipeline)
在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。
当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。
图4. 理解 Http 管道
我们按编号来看一下这幅图中的数据是如何流动的。
1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。、
2. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。
3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:
// 代码省略
}
可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。
4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。
如果我们将注意力只集中在Http请求、HttpHandler和HttpModule上,不去考虑HttpContext和HttpApplication,那么图4.可以简化成下面这样:
图5.Http请求在HttpHandler 和 HttpModule 中的流动方向
总结
本文中,我首先概要介绍了这系列文章将要为大家讲述的主题。然后,我提出了部分程序员存在的一个问题:在一个比较高的层次上学习和使用Asp.Net。
随后,我以一个访问我个人空间首页的例子,引出了本文主要讲述的三个内容:
- Http请求刚刚到达时IIS时,IIS 所做的工作。
- Http请求的宿主环境。
- Http管道。
评论
但是在看的同时,我也有一个问题,感觉跟以前理解的有一点冲突。
就是在 理解管道(Pipeline)中对图解说的第一条,有一句是这么说的:
“HttpApplication创建针对此Http请求的 HttpContext对象”
以前一直认为HttpContext 对象和HttpApplication对象都是由HttpRuntime创建的,并且是先创建HttpContext,后创建HttpApplication对象,同时把上下文对象传给HttpApplication的。
求解,谢谢!
发表评论
-
最JAVA网站,欢迎访问!
2011-03-19 22:01 998最JAVA - JAVA编程 J2EE dhtmlx 数据库 ... -
hibernate3.5使用annotation实现双向一对多关联
2010-09-05 21:57 1399从Hibernate 2.5开始就可以使用annotatio ... -
强大的TcpServer压力测试工具源码(附突破连接限制的方法和工具)
2010-07-27 17:34 3997强大的TcpServer压力测试工具源码(附突破连接限制的方法 ... -
spring security 使用数据库管理资源
2010-07-02 17:04 2143使用spring security控制整个项目的权限访问。在数 ... -
jmesa 入门
2010-06-26 12:08 1619最近项目中需要用到jmesa分页,但在网上几乎没 ... -
Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
2010-05-12 16:21 1544最近在网上看到一些人讨论到java.lang.Runtime ... -
用JSP实现基于Web的RSS阅读器(REMO)
2010-04-11 14:16 1262一 RSS介绍 根据维基百科(http ... -
RSS介绍
2010-04-11 14:07 1057一:什么是RSS RSS(really simple syn ... -
java去除字符串中的空格、回车、换行符、制表符
2010-03-18 10:33 5122java去除字符串中的空格、回车、换行符、制表符,本方法采用的 ... -
hibernate3连接池
2010-03-17 11:59 9261.Hibernate默认连接池<!---->&q ... -
Spring+Hibernate+Proxool连接池
2010-03-17 11:59 1243在applicationContext.xml同一级目录下新建 ... -
使自定标签支持EL表达式(${})
2010-01-18 13:48 1422要做下面两件事就可以达到目的了: 1 在tld文件如下配置 ... -
常用的WEB服务器介绍
2009-10-18 21:44 2052在UNIX和LINUX平台 ... -
JSTL 中的<c:catch>标签
2009-10-17 15:07 1661<c:catch>主要用来处理产生错误 ... -
插件技术原理介绍
2009-10-02 16:20 3212插件是一种遵循统一的预定义接口规范编写出来的程序 ... -
Tomcat 服务器详解
2009-08-05 11:22 830Tomcat启动分析 1 - Tomcat Server的组成 ... -
Java 位运算符
2009-07-28 16:10 1367Java 定义的位运算(bitwise operators ) ... -
Java对象的初始化顺序
2009-07-13 11:42 992有这样的一段代码: p ... -
String类型对象是否改变
2009-07-13 11:23 1067因为String被设计成不可变(immutable)类, ... -
JAVA中的JDK和JVM
2009-07-10 20:57 15901.任何一门语言的开发都需要提供基本的架构对其支持,在java ...
相关推荐
### IIS工作原理详解 #### 引言 随着网络应用的普及与发展,Web服务器成为连接用户与信息的重要桥梁。在众多Web服务器软件中,Microsoft Internet Information Services (IIS) 是一款广泛使用的服务器软件,尤其在...
【IIS工作原理-通俗易懂】 IIS(Internet Information Services)是Microsoft Windows操作系统中的一个组件,用于管理和处理HTTP请求,使得用户可以通过Web浏览器访问Web应用程序和服务。了解IIS的工作原理有助于...
### IIS的工作原理详解W3SVC #### DirectoryEntry与IIS路径解析 在深入探讨IIS(Internet Information Services)的工作原理之前,我们先来了解一下DirectoryEntry这一概念及其在IIS中的应用。DirectoryEntry作为...
该WebServer基于C#编程语言实现,提供了源代码,使得开发者能够更深入地理解和定制服务器功能,这对于学习IIS工作原理或者进行二次开发的人员来说非常有价值。 【Aspx】是ASP.NET中的页面扩展名,它代表一种服务器...
标题"IIS启动停止的BAT"指的是使用批处理脚本来控制Internet Information Services (IIS)的启动和停止。IIS是Microsoft提供的一款...同时,通过编写和调试这些脚本,还可以加深对Windows服务管理和IIS工作原理的理解。
【IIS站点监控】 IIS(Internet Information Services)是微软提供的一个用于运行Web应用程序的服务器组件,它提供了HTTP、HTTPS等多种...而实现这一目标,需要结合合适的工具、技术,以及对IIS工作原理的深入理解。
在IT行业中,IIS(Internet ...易语言IIS创建站点模块例程源码为学习者提供了一个实践平台,有助于深入理解IIS工作原理及模块开发。在实际项目中,根据业务需求灵活运用这些技术,能够提升Web应用的性能和用户体验。
IIS(Internet Information Services)是微软公司开发的一款用于Windows操作系统上的Web服务器软件,...虽然XP系统已经过时,但理解其上的IIS工作原理和操作方法,对于理解Web服务器的运作和历史发展仍具有一定的价值。
【IIS网站预编译工具】是一个用于提升ASP.NET网站性能和优化服务器资源管理的实用程序,源码的提供使得用户可以根据...通过源码学习,开发者不仅可以自定义工具以满足特定需求,还能加深对ASP.NET和IIS工作原理的理解。
**IIS工作原理** IIS采用多层架构,主要包括以下组件: 1. **World Wide Web Publishing Service (W3SVC)**:这是IIS的核心服务,负责接收HTTP请求并分发到相应的应用程序池。 2. **Application Pools**:每个...
本资源包包含了与IIS音频CODEC相关的电路原理图和代码,对于理解和实现IIS音频系统具有重要的参考价值。 首先,让我们详细探讨IIS接口。IIS接口设计的目标是简化数字音频信号在不同IC(集成电路)间的传输,减少...
综上所述,"XP SP3 IIS 6.0"是一个允许个人用户在Windows XP环境下搭建Web服务的解决方案,虽然现在已经较为过时,但对于学习和了解IIS工作原理仍有其价值。使用时,需充分理解其特性和局限性,确保系统的安全和稳定...
**一、IIS工作原理** IIS通过一系列可扩展的模块来处理HTTP请求。这些模块负责解析请求、执行脚本、处理静态内容以及与数据库交互等任务。当IIS启动时,它会加载这些模块,以便在需要时能够快速响应客户端请求。`...
总结,IIS 5.1作为Windows XP时代的Web服务器解决方案,虽然在今天可能显得有些过时,但对于学习基础的Web服务和理解IIS工作原理仍然有价值。然而,对于生产环境,推荐使用更新的IIS版本以确保更好的性能和安全性。
"手动清除IIS日志" IIS日志文件清除是web服务器管理中一个重要的日常维护任务。手动清除IIS日志可以释放服务器磁盘空间,防止日志文件过大影响服务器性能,并且可以防御日志清除攻击。 一、IIS日志文件简介 IIS...
4. 配置多线程和工作进程,适应高并发访问。 六、扩展与集成 1. 集成FTP服务,提供文件上传和下载功能。 2. 安装WebDAV模块,实现Web编辑功能。 3. 配置SMTP服务器,实现邮件发送。 4. 使用IIS7以上的应用程序生命...
总的来说,这个源文件包对于想要学习IIS工作原理、服务器编程、C/C++实战和轻量级Web服务开发的开发者来说,是一个宝贵的资源。通过研究和分析这些源码,可以提升自己的编程技能和系统架构能力。
综上所述,处理iis6元数据库与iis6配置的兼容问题,关键在于理解IIS 6的工作原理及其对系统的要求,以及采取适当的步骤来确保其在特定环境中能够正常运行。对于那些依赖于旧版IIS服务的组织而言,保持系统的兼容性和...
理解这个IIS重启脚本的工作原理,通常涉及到以下步骤: 1. 使用`net stop`命令停止IIS服务。 2. 可能会有一些延迟,等待所有关联进程完全关闭。 3. 使用`net start`命令启动IIS服务。 4. 脚本可能还包括错误处理...