这样看来,如果客户访问的动态页面存在大量的数据库查询以及较为复杂的逻辑运算,特别是访问人数比较多的情况下,响应时间会大大增加,服务器所承受的压力也会明显增大[2],那么我们如何将静态页面的处理的快速性与动态页面处理的灵活性相结合,达到缩短服务器处理时间的同时,快速响应客户端请求的理想效果呢?这就要用到动态页面静态化技术了。
3. HttpHandler静态化相关技术
静态化页面的实现方法根据网站开发平台的不同也会有所差别,目前比较流行的网站开发平台是ASP.NET,那么我们很有必要先了解一下ASP.NET ISAPI的运行机制。
3.1 ISAPI过滤器
ISAPI过滤器Internet Server Application Programming Interface的缩写,IIS本身仅仅支持静态HTML页面的内容,对于.asp、.aspx 、.php等,IIS并不知道怎样处理这些后缀标记,就会把它看作纯文本,不做任何处理发送至客户端[3],如何解决这个问题呢?
ASP.NET服务在注册到IIS时,会把每个能够处理的文件扩展名注册到IIS里面(如*.aspx等)。扩展启动后就会根据定义好的方式来处理这些IIS之前不能处理的文件,然后把控制权跳转到专门处理代码的进程中(ASP.NET中是aspnet_isapi.dll),并开始进行处理,然后把生成的标准HTML代码加入到原有HTML中,最后把完整的HTML返回给IIS,IIS再把它发送至客户端[4]。
3.2 ASP.NET请求的处理机制
HttpHandler是HTTP请求真正的处理中心,它会对客户端请求的服务器页面做出编译和执行,然后将处理后的信息附加在HTTP请求信息流中返回到HttpModule中。在此需要说明的是,HttpHandler与HttpModule有所不同,HttpHandler一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系[5]。
3.2.1 HttpModule
HttpModule实现了过滤器的功能,它是实现System.Web.IHttpModule接口的.net组件。这些组件通过在某些事件中注册自身,把自己插入到ASP.NET请求处理管道。当这些事件发生时,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。
3.2.2 HttpHandler
HttpHandler实现了ISAPI Extention的功能,它处理请求(Request)的信息和发送响应(Response)。HttpHandler的功能必须通过IHttpHandler接口实现。HTTP处理程序是实现System.Web.IHttpHandler接口的.NET组件。
HttpHandler和HttpModule一样,最初系统会由ASP.NET Framework首先加载machine.config中的HttpHandler,然后加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但系统与我们自定义的HttpHandler之间将是“覆盖”关系,也就是说,如果我们自定义了一个针对“.aspx”的HttpHandler类,那么系统就会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理。
3.2.3 IHttpHandler接口
IHttpHandler是ASP.NET Framework提供的一个接口,定义了要实现一个Http请求处理所需要实现的一些系统约定。.NET Framework为开发者提供了一组接口和类,它允许开发者通过对客户端Http请求进行编程处理,从而实现这一操作的一个主要接口IHttpHandler,系统给出的IHttpHandler的定义如下所示:
public interface IHttpHandler{
void ProcessRequest(HttpContext context);
bool IsReusable { get; }
}
从以上定义可以看出IHttpHandler要求实现一个方法和一个属性。其中 ProcessRequest方法应该放置我们处理请求的主要代码。IsReusable属性:是布尔类型的值,取值True/False,获取一个值,该值指示后继的Http请求是否可以继续使用实现了该接口的类的实例,一般来说,应把它设置成true。
(1)当Http请求提交到服务器端时,IIS 检查所请求的资源类型并调用 ASP.NET ISAPI,步骤如下:a、调用ASP.NET 辅助进程b、辅助进程加载.NET运行时环境c、ASP.NET ISAPI将请求转发给辅助进程。 基于HttpHandler的页面静态化研究(3):http://www.youerw.com/jisuanji/lunwen_2490.html