手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

ASP.NET构架与安全机制之Http请求处理

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  3. 选择“主目录”选项卡。

  4. 选择“配置”。

  你应该会看到如下的画面:

  图1. 应用程序配置

  

  很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。

  我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:

  图2. 编辑.aspx文件的处理程序

  

  一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。

  这里需要注意两点:

  1、当你修改“限制为”后,可以限制页面(文件)只能以某种特定方式访问。

  2、“确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。

  理解宿主环境(Hosting)

  从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。

  NOTE:二般来说,也可以是张图片。

  当 Web.config文件的内容发生改变 或者 .aspx文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。

  NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是 AppDomain。

  对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。

  NOTE:实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问不存在的文件会出现 404 错误呢?就是在这一步确定的。

  如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。

  NOTE:IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe。

  每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。

  NOTE:可选性能参数,是指诸如 回收机制的设置、超时时间设置 等等。

  接下来进行的事情就是上一章节讲述的 ISAPI 了。

  NOTE:这部分的内容相关性比较强,为了让大家好理解,我最后还是决定把 ISAPI 放到前面了,可能全系列完成的时候会再调整吧。

  除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

  1. 从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。

  2. 在相互隔离的应用程序域AppDomain中加载HttpRuntime。

  3. 调用 HttpRuntime的ProcessRequest方法。

  接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

  OK,现在你看到张子阳的空间主页了。

  图3.Asp.Net 的宿主环境

  

  理解管道(Pipeline)

  在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。

  当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理器(NOTE:Handlers,这可不是CPU)组成,并且由管道来处理这个 Http请求。

  图4. 理解 Http 管道

  

  我们按编号来看一下这幅图中的数据是如何流动的。

  1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。

  2. 接下来Http请求通过一些Module,这些Module可以做一些执行某个实际工作前的事情。

  3. 在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。

  4. Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。

  NOTE:注意我用红色标识的字,然后回想一下:Asp.Net 中是不是有众多的 Inserting 、Inserted 之类成对的事件?其实,这里讲述的就是为什么Asp.Net可以将一个Insert操作分成前后两部分,然后再分别进行事件拦截的幕后原理。

  总结

  本文是《Asp.Net构架与安全机制》系列文章的第一篇。

  我首先概要介绍了这系列文章将要为大家讲述的主题。然后,我提出了部分程序员存在的一个问题:在一个比较高的层次上学习和使用Asp.Net。

  随后,我以一个访问我个人空间首页的例子,引出了本文主要讲述的三个内容:

  1. Http请求刚刚到达时IIS时,IIS 所做的工作。

  2. Http请求的宿主环境。

  3. Http管道。

  希望这篇文章能给你带来帮助。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!