我的CMS开发记-5 实现静态化页

      为了实现静态化页,我在博客园里可是搜了半天。最后找到两个方案:

  1.  http://www.cnblogs.com/hsqzzzl/archive/2005/10/23/260122.html文中的,生成静态页后,使用url重写重定向到静态页上。
  2. http://www.cnblogs.com/nurong/archive/2005/10/15/255439.html 使用404方式动态地生成静态页。

那么这两种那个好呢?嘿嘿,本人的办法是,两种都实现,然后自己选择。是啊,不试一试怎么知道哪种效率更好。

实现方面没啥多说的,基本和两位的办法差不多。但是在生成静态页时,我用的既不是filter的办法,也不是webclient的那种采集式的方法。因为我的系统比较特殊,是DNN式的单页面系统。所以,最佳的实现方法,是孟子E章的重写Render方法的办法。原来很简单,先将Render执行的结果保存在字符串里,然后保存到文件里,最后在Response.write。

ContractedBlock.gif ExpandedBlockStart.gif Code
protected override void Render(HtmlTextWriter writer)
    {

        
//***收到此标志表示需要将此页面静态化

        
if (HttpContext.Current.Items.Contains("createstaticfile"))
        {
            
string file = (string)HttpContext.Current.Items["createstaticfile"];

            
using (System.IO.StringWriter html = new System.IO.StringWriter())
            {
                
using (System.Web.UI.HtmlTextWriter tw = new HtmlTextWriter(html))
                {

                    
base.Render(tw);
                    Response.Write(html);


                    StaticFile.CreateHtml(file, html.ToString(), Response.ContentEncoding);

                }



            }

        }
        
else
        {
            
base.Render( writer );
        }
    }

代码很简单,我就不多废话了。

根据我的测试,404方式的静态化页,并没有出现先返回404再出现正确页面的情况。我用httpwatch 跟踪下来,http的头返回是这样的:如果html页不存在,那么返回302错误,然后转向到自定义404页。自定义404页根据参数判断请求的页面,如果合法,那么马上生成这个页面,这时候要注意,不能直接server.transfer到静态页。否则浏览器的url会错误。必须待生成完毕后 ,先返回一个(no-cahce)的标记    然后 response.redirect到静态页去。如果不指定no-cahce将会导致浏览器呈现一个空白页。如果请求非法,那么404页面就输出404标头。

   因此,404法静态化确实可行,而且不会出现错误地返回404的情况,大可以放心使用。主要代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
Regex r = new Regex(p, RegexOptions.IgnoreCase);
            Match m 
= r.Match(requrl);

            
if (m.Length > 0)
            {
                
//Response.Write("ceate");
                
//Response.End();

                HttpContext.Current.Items.Add(
"createstaticfile",Server.MapPath(m.Groups["url"].Value ));
                DNNLite.Url.Use404StaticUrl.IsCreateStaticUrlAnyWay 
= true;
                
try
                {
                    Server.Execute(StaticToQry(m.Groups[
"url"].Value));
                }
                
catch (Exception)
                {
                    OutPut404();
                }
                
                Response.Clear();
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.Redirect(m.Groups[
"url"].Value);
                
return;
            }

 

至于动态页,url重定向静态页,和404法静态页的效率,我这里也试了一下:在本地机器上,用httpwatch观察,在我充分地利用了缓存等的前提下,动态首页大约响应时间是0.010秒,而url法和404法两者的响应时间 均为0.001秒。httpwatch提示<0.001。

但是在虚拟主机上,情况就大不相同了,我使用的是最便宜的空间,经过尝试,404法的速度要远高于url法。因为404法的静态页根本不经过asp.net,iis直接就处理了,而url法需要经过asp.net,由于虚拟主机的关系,始终是要慢了一点。

     维护方便性上,url法要优于404法,url法配置方便,并且更新也方便,可以将需要更新的页面的url存在内存里,每次rewrite的时候就可以判断了。而404法则比较麻烦,如果要更新页面,则必须要设法删除原来的静态页面,404页面才能再次生效。而且在配置时需要虚拟主机配置404页,否则根本无法使用。

     最后要感谢两位前辈趟出来的路,才能实现得比较顺利。



 


 

 

转载于:https://www.cnblogs.com/ashei/archive/2009/01/16/1377260.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值