前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的CMS开发记-5 实现静态化页

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

作者头像
用户1687945
发布2018-05-02 11:32:24
9740
发布2018-05-02 11:32:24
举报
文章被收录于专栏:烙馅饼喽的技术分享

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

  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。

代码语言:javascript
复制
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的情况,大可以放心使用。主要代码:

代码语言:javascript
复制
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页,否则根本无法使用。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-01-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档