注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

哈哈~

八零后尾巴上的小青年^_^……

 
 
 

日志

 
 

引用 .net中如何生成静态htm页面  

2010-07-20 20:05:25|  分类: 测试分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

引用

风之ai.net中如何生成静态htm页面

 

静态页面也就是写死的页面,不能像传统的aspx页面一样有事件以及和用户的交互,但是它确是搜索引擎的最爱,绝大多数的门户网站的内容都是由静态页面组成的,静态页面的生成除了写拼字符串生成文件外还有以下几种比较常用的方式:

1.使用WebRequest对象

首先,你可以有一个已经做好的动态aspx页面,这个aspx页面根据传入的id从数据库中读取一条新闻然后显示在页面上。我们的目的是为每一条新闻生成一个静态页面。

WebRequest request = WebRequest.Create(pageurl);//pageurl是你那个aspx页面的地址
             WebResponse response = request.GetResponse();
             Stream resstream = response.GetResponseStream();//获取生成的页面信息
             StreamReader sr = new StreamReader(resstream, System.Text.Encoding.Default);
             string contenthtml = sr.ReadToEnd();//读入信息
             resstream.Close();
             sr.Close(); //写入文件
             System.IO.StreamWriter sw;
             sw = new System.IO.StreamWriter(Server.MapPath("test.htm"), false, System.Text.Encoding.Default);//生成静态页面文件
             sw.Write(contenthtml);
             sw.Close();

 

2.使用传统的字符串处理

首先,做好一个模版静态页面,比如test.htm,其中需要填写内容的地方用特殊符号标示出来,比如一个GUID号,程序每次把这个文件作为一个字符串读入,然后用相关内容替换那个GUID号,再输出到硬盘上。

 

3.个人认为最好的方式,参考国外的一个blog,利用aspx自己的render机制生成静态页面

.net 的页面生成机制中最后一步是一个Render(HtmlTextWriter writer)方法,它接受一个HtmlTextWriter对象,并最后生成html页面传给客户端,其中HtmlTextwriter对象就保存了向客户端传送的html代码,我们的目的就是要把这段html代码完整的搞过来。

首先,我们定义一个自己的类继承那个HtmlTextWriter类

public class OwnTextWriter : HtmlTextWriter
    {
        internal OwnTextWriter(TextWriter tw)
            : base(tw)
        {
        }    
    }

其次,也就是最关键的部分,我们注意到HtmlTextWriter有个构造函数接受一个TextWriter 作为参数,而TextWriter类与StringWriter类是可以互相转换的,这就是说我们可以使用一个StringWriter类构造这个类并完整地利用.net的render方法让页面将html代码写入StringWriter类。

    public class HTMLCreator
    {
        StringWriter tw = null;
        OwnTextWriter twb = null;
        public HTMLCreator()
        {
            tw = new StringWriter();
            twb = new OwnTextWriter(tw);
        }

        public HtmlTextWriter GetTextWriter
        {
            get { return twb; }
        }

        public void WriteHTMLFile(string virtualFileName) //此方法用来将StringWriter里面的内容写入文件,基本没什么说的
        {
            // Stringreader reads output rendered by asp.net
            // Stringwriter writes html output file
            StringReader sr = new StringReader(tw.ToString());
            StringWriter sw = new StringWriter();

            // Read from input
            string htmlLine = sr.ReadLine();
            while (htmlLine != null)
            {
                // Filter out ASp.net specific tags
                if (!((htmlLine.IndexOf("<form") > 0) ||
                      (htmlLine.IndexOf("__VIEWSTATE") > 0) ||
                      (htmlLine.IndexOf("</form>") > 0)))
                { sw.WriteLine(htmlLine); }

                htmlLine = sr.ReadLine();
            }

            // Write contents stringwriter to html file
            StreamWriter fs = new StreamWriter(virtualFileName);
            fs.Write(sw.ToString());
            fs.Close();
        }

    }

最后,怎么使用这个类

public partial class _Default : System.Web.UI.Page
    {
        protected override void Render(HtmlTextWriter writer)
        {
            HTMLCreator hc = new HTMLCreator();
            base.Render(hc.GetTextWriter);//hc.GetTextWriter是将StringWriter 传入页面,此方法执行完成之后,StringWriter 将拥有所有页面的html代码
            hc.WriteHTMLFile(@"D:\Project\TestProjects\Published Sites\test.htm");//写文件,之后这个default页面将不会显示任何内容,因为它自己的那个writer被我们给替换了,所以需要重定向。
        }   

    }

 

三种方式各有千秋,前2种比较简单,一看就会用,可是第一种有着不必要的request和response过程,对性能有影响,第二种效率比较低,而且不面向对象,第三种比较面向对象,可以完全不考虑静态页面生成而专注于动态页面开发,.net会自动将这个动态页面转变为静态页面。

  评论这张
 
阅读(128)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017