当前位置:首页 > 申请书大全 > 页面静态化 [基于HttpHandler的页面静态化]
 

页面静态化 [基于HttpHandler的页面静态化]

发布时间:2019-02-21 04:44:12 影响了:

  摘要:HttpHandler是ASP.NET服务器端用于进行Http请求处理的核心容器,开发者可以使用HttpHandler编程处理Http请求,从而丰富了服务器端对Http请求的处理功能。本文通过对HttpHandler实现动态页面静态化来阐述服务器端编码方式处理请求的过程。
  关键词:ASP.NET HttpHandler 页面静态化 性能
  中图分类号:TP311.1 文献标识码:A 文章编号:1007-9416(2012)01-0050-02
  
  1、引言
  ASP.NET是微软推出的一种Web服务器端开发技术,我们在做ASP.NET开发时通常更多的是考虑页面上实现的功能,例如:数据怎么在页面上显示,用户登录该如何实现等。但我们很少考虑在服务器端如何通过编程的方式去处理请求,例如:当客户端请求一个aspx页面时,默认情况下服务器会编译并执行这个动态页面,并将执行结果输出到客户端,这就是一个典型的“请求-响应”的过程。但如果该页涉及到大数据量的数据库查询以及较为复杂的逻辑运算,特别是在该页面并发访问人数较多的情况下,响应时间会大幅度增多,服务器压力也会增加。怎么解决这个问题?我们可以采用动态页面静态化技术解决这个问题。
  2、页面静态化的概念
  页面静态化即把动态页面转换成静态页面。页面静态化的优势:(1)有利于搜索引擎搜索、(2)没有丢掉动态页面维护内容的方便性、(3)性能和安全方面的提升。早期的搜索引擎并不能很好的检索如*.jsp,*.aspx等的服务器动态页面, 但是对*.html等静态页面却有良好的检索效果,于是就产生了一种“动态页面静态化”的技术,在ASP.NET中就是把用户对同一个aspx页面的不同请求结果保存到不同的html文件中,在以后的对该aspx页面的请求,将调用相应html页面作为对客户端的响应,这样将大大节省服务器端处理时间,以达到快速响应客户端请求的效果。
  要想实现动态页面的静态化必须先了解ASP.NET ISAPI的运行机制。
  2.1 ASP.NET 请求的处理过程如下
  (1)当Http请求提交到服务器端时,IIS 检查所请求的资源类型并调用 ASP.NET ISAPI,步骤如下:1)调用ASP.NET 辅助进程(IIS 6 对应为w3wp.exe);2)辅助进程加载.NET运行时环境;3)ASP.NET ISAPI将请求转发给辅助进程。
  (2)辅助进程收到请求,通知ASP.NET ISAPI它将进行处理 。
  (3)在辅助进程的上下文中执行处理过程,步骤如下:1)在.NET 运行时环境中执行;2)经HttpModule容器和HttpHandler容器处理。
  (4)处理完毕,通知ASP.NET ISAPI完成。在这个处理过程中我们重点关注的是如何通过HttpModule和HttpHandler 来处理Http请求。
  2.2 HttpModule和HttpHandler如何处理HTTP请求
  当一个HTTP请求经若干个HttpModule容器传递到HttpHandler容器中时,ASP.NET 框架会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个aspx页面为例,正是在这里一个aspx页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。
  .NET Framework提供了一组接口和类,允许开发者对于Http请求进行编程,而实现这一操作的一个主要的接口,就是 IHttpHandler(另一个是IHttpModule)。IHttpHandler的定义是这样的:
  public interface IHttpHandler{
  void ProcessRequest(HttpContext context);
  bool IsReusable { get; }
  }
  可以看出IHttpHandler要求实现一个方法和一个属性。其中 ProcessRequest方法应该放置我们处理请求的主要代码。IsReusable属性:获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。也就是说后继的Http请求是不是可以继续使用实现了该接口的类的实例,一般来说,应把它设置成true。Http请求从HttpModule到HttpHandler的过程如图1所示。
  3、实现结果及分析
  以下以单个产品详细信息页面生成静态页为例,说明HttpHandler在处理Http请求中的应用,使用HttpHandler实现页面静态化的实现步骤。
  制作html模板,做为静态化页显示部分的基础:
  其中[]部分为占位符,将在HttpHandler中根据不同产品信息进行替换,Html代码如下:
  品牌:[Brand]
  价格:[Price]
  4、使用HttpHander生成静态页面
  public class HtmlHandler : IHttpHandler
  {
  public void ProcessRequest(HttpContext context)
  {
  //ProductId是从context中截取的产品ID,代码略。
  string filePath = context.Server.MapPath(
  "~/ProductDetails/Product_" + ProductId + ".htm");
  ProductManager manager = new ProductManager();//业务逻辑层对象
  context.Application.Lock(); //加锁
  if (!File.Exists(filePath)) //如果请求的静态页不存在,则动态生成该静态页
  {
  string templatePath = context.Server.MapPath(
  "~/ProductDetails/template.htm");//模板路径
  string template = ""; //模板内容
  using (StreamReader sr = new StreamReader(templatePath))
  {
  template = sr.ReadToEnd();//读取模板内容
  }
  Product Product = manager.GetProductById(ProductId);//获取Product信息
  string html = template.Replace("[WebRootPath]",
  context.Request.ApplicationPath) //替换Web路径
  .Replace("[ProductId]", ProductId.ToString())
  … … //依次将html模板中的占位符替换成当前产品的相应信息
  using (StreamWriter sw = new StreamWriter(filePath))
  {
  sw.Write(html); //写入静态化页面内容
  }
  }
  context.Application.UnLock(); //解锁
  context.Server.Execute("~/ProductDetails/Product_" + ProductId
  + ".html"); //转到实际路径
  }
  }
  
  web.config中添加如下配置,用于进行静态页与HttpHandler的映射:
  
  
  
  当用户访问以产品ID为名称的页面时(如:3234212.html),将交到HttpHandler中进行处理,如果该页面不存在,将服务器将动态生成该静态页同时保存下来,并交给客户端。以后对同一个产品的请求就可以直接获取该静态页了。
  5、结语
  利用HttpHandler进行Http请求中的动态页面静态化,可以加快服务器端响应速度,减轻服务器端处理数据的压力,通过Web测试和负载测试,可以看到对于复杂页面处理和请求量比较大的页面有着性能上的显著提高。使用HttpHandler还可以实现除页面静态化以处其他功能,例如数字水印、防盗链等,有很丰富的应用范围。
  参考文献
  [1]李敏波.ASP.NET 2.0高级编程[M].北京:清华大学出版社,2006.
  [2]梁博.测试有道[M].北京:电子工业出版社,2009
  [2]王征.项目模型及业务流程分析[J].程序员,2002(1).
  [4]廖江福.基于HttpHandler的ASP.NET软件RSA签名研究[J].重庆工商大学学报,2010.1.
  作者简介
  沈阳(1978-),男,安徽合肥人,软件工程硕士,专业教师,工作单位:广东岭南职业技术学院,研究方向:软件工程,Web及移动设备软件开发。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3