ASP.NET生成静态页面

来源:互联网 发布:淘宝产品排名规则 编辑:程序博客网 时间:2024/04/30 17:04

第一种方法:向服务器的动态页面发送请求,获取页面的html代码。这种方法缺点显而易见:速度慢。另外如果请求的动态页面有验证控件的话,返回的html页面却无法进行数据验证。但这种方法写起来比较简单。主要代码如下:

view plaincopy to clipboardprint?
#region//生成被请求URL静态页面  
public static void getUrltoHtml(string Url,string Path)//Url为动态页面地址,Path为生成的静态页面  
{  
 try 
 {  
  System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);  
    // Get the response instance.  
  System.Net.WebResponse wResp =wReq.GetResponse();  
    // Get the response stream.  
  System.IO.Stream respStream  = wResp.GetResponseStream();  
    // Dim reader As StreamReader = New StreamReader(respStream)  
  System.IO.StreamReader reader = new System.IO.StreamReader(respStream,System.Text.Encoding.GetEncoding("gb2312"));  
  string str=reader.ReadToEnd();  
  System.IO.StreamWriter sw=new System.IO.StreamWriter(Path,false,System.Text.Encoding.GetEncoding("gb2312"));  
  sw.Write(str);  
  sw.Flush();  
  sw.Close();  
  System.Web.HttpContext.Current.Response.Write("<mce:script type="text/javascript"><!--  
alert('页面生成成功!');  
// --></mce:script>");  
 }  
 catch(System.Exception ex)  
 {  
  System.Web.HttpContext.Current.Response.Write("<mce:script type="text/javascript"><!--  
alert('页面生成失败!"+ex.Message+"');  
// --></mce:script>");  
 }  

#endregion 
#region//生成被请求URL静态页面
public static void getUrltoHtml(string Url,string Path)//Url为动态页面地址,Path为生成的静态页面
{
 try
 {
  System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);
    // Get the response instance.
  System.Net.WebResponse wResp =wReq.GetResponse();
    // Get the response stream.
  System.IO.Stream respStream  = wResp.GetResponseStream();
    // Dim reader As StreamReader = New StreamReader(respStream)
  System.IO.StreamReader reader = new System.IO.StreamReader(respStream,System.Text.Encoding.GetEncoding("gb2312"));
  string str=reader.ReadToEnd();
  System.IO.StreamWriter sw=new System.IO.StreamWriter(Path,false,System.Text.Encoding.GetEncoding("gb2312"));
  sw.Write(str);
  sw.Flush();
  sw.Close();
  System.Web.HttpContext.Current.Response.Write("<mce:script type="text/javascript"><!--
alert('页面生成成功!');
// --></mce:script>");
 }
 catch(System.Exception ex)
 {
  System.Web.HttpContext.Current.Response.Write("<mce:script type="text/javascript"><!--
alert('页面生成失败!"+ex.Message+"');
// --></mce:script>");
 }
}
#endregion

第二种方法:从文件读取模版,替换模版中的参数后输出文件,这种方法的生成速度上比第一种要快许多,而且模版内容可以用工具任意编辑
主要代码:

view plaincopy to clipboardprint?
public class Create  
{  
 public void CreatePage()  
 {  
   
 }  
 public static bool WriteFile(string strText,string strContent,string strAuthor)  
 {  
  string path = HttpContext.Current.Server.MapPath("/test/");//文件输出目录  
  Encoding code = Encoding.GetEncoding("gb2312");  
  // 读取模板文件  
  string temp = HttpContext.Current.Server.MapPath("/template/test.html");//模版文件  
  StreamReader sr=null;  
  StreamWriter sw=null;  
  string str="";   
  try 
  {  
   sr = new StreamReader(temp,code);  
   str = sr.ReadToEnd(); // 读取文件  
  }  
  catch(Exception exp)  
  {  
   HttpContext.Current.Response.Write(exp.Message);  
   HttpContext.Current.Response.End();  
   sr.Close();  
  }  
 
 
  string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";//静态文件名  
 
  // 替换内容  
  // 这时,模板文件已经读入到名称为str的变量中了  
  str = str.Replace("ShowArticle",strText); //模板页中的ShowArticle  
  str = str.Replace("biaoti",strText);  
  str = str.Replace("content",strContent);  
  str = str.Replace("author",strAuthor);  
  // 写文件  
  try 
  {  
   sw = new StreamWriter(path + htmlfilename , false, code);  
   sw.Write(str);  
   sw.Flush();  
  }  
  catch(Exception ex)  
  {  
   HttpContext.Current.Response.Write(ex.Message);  
   HttpContext.Current.Response.End();  
  }  
  finally 
  {  
   sw.Close();  
  }  
  return true;  
 }  
}  
 
/原理是利用System.IO中的类读写模板文件,然后用Replace替换掉模板中的标签,写入静态html 
 public class Create
 {
  public void CreatePage()
  {
 
  }
  public static bool WriteFile(string strText,string strContent,string strAuthor)
  {
   string path = HttpContext.Current.Server.MapPath("/test/");//文件输出目录
   Encoding code = Encoding.GetEncoding("gb2312");
   // 读取模板文件
   string temp = HttpContext.Current.Server.MapPath("/template/test.html");//模版文件
   StreamReader sr=null;
   StreamWriter sw=null;
   string str="";
   try
   {
    sr = new StreamReader(temp,code);
    str = sr.ReadToEnd(); // 读取文件
   }
   catch(Exception exp)
   {
    HttpContext.Current.Response.Write(exp.Message);
    HttpContext.Current.Response.End();
    sr.Close();
   }


   string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";//静态文件名

   // 替换内容
   // 这时,模板文件已经读入到名称为str的变量中了
   str = str.Replace("ShowArticle",strText); //模板页中的ShowArticle
   str = str.Replace("biaoti",strText);
   str = str.Replace("content",strContent);
   str = str.Replace("author",strAuthor);
   // 写文件
   try
   {
    sw = new StreamWriter(path + htmlfilename , false, code);
    sw.Write(str);
    sw.Flush();
   }
   catch(Exception ex)
   {
    HttpContext.Current.Response.Write(ex.Message);
    HttpContext.Current.Response.End();
   }
   finally
   {
    sw.Close();
   }
   return true;
  }
 }

//原理是利用System.IO中的类读写模板文件,然后用Replace替换掉模板中的标签,写入静态html

第三种方法:如果生成的文件数量比较多,第二种方法就要反复读取模版内容,这时可以用第三种方法——直接将你的模版写在代码中:

view plaincopy to clipboardprint?
/// <summary>  
/// 自定义公共函数  
/// </summary>  
public class myfun  

 
 #region//定义模版页  
 public static string SiteTemplate()  
 {  
  string str="";  
  str+="...";//模版页html代码  
  return str;  
 } 
 
 #endregion  
 
 public static bool WriteFile(string strText,string strContent,string strAuthor)  
 {  
  string path = HttpContext.Current.Server.MapPath("/test/");//文件输出目录  
  Encoding code = Encoding.GetEncoding("gb2312");  
 
  StreamWriter sw=null;  
  string str=SiteTemplate();//读取模版页面html代码   
 
  string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";//静态文件名  
 
  // 替换内容  
  str = str.Replace("ShowArticle",strText);  
  str = str.Replace("biaoti",strText);  
  str = str.Replace("content",strContent);  
  str = str.Replace("author",strAuthor);  
  // 写文件  
  try 
  {  
   sw = new StreamWriter(path + htmlfilename , false, code);  
   sw.Write(str);  
   sw.Flush();  
  }  
  catch(Exception ex)  
  {  
   HttpContext.Current.Response.Write(ex.Message);  
   HttpContext.Current.Response.End();  
  }  
  finally 
  {  
   sw.Close();  
  }  
  return true;  
 }  

 /// <summary>
 /// 自定义公共函数
 /// </summary>
 public class myfun
 {

  #region//定义模版页
  public static string SiteTemplate()
  {
   string str="";
   str+="...";//模版页html代码
   return str;
  }

  #endregion

  public static bool WriteFile(string strText,string strContent,string strAuthor)
  {
   string path = HttpContext.Current.Server.MapPath("/test/");//文件输出目录
   Encoding code = Encoding.GetEncoding("gb2312");

   StreamWriter sw=null;
   string str=SiteTemplate();//读取模版页面html代码

   string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";//静态文件名

   // 替换内容
   str = str.Replace("ShowArticle",strText);
   str = str.Replace("biaoti",strText);
   str = str.Replace("content",strContent);
   str = str.Replace("author",strAuthor);
   // 写文件
   try
   {
    sw = new StreamWriter(path + htmlfilename , false, code);
    sw.Write(str);
    sw.Flush();
   }
   catch(Exception ex)
   {
    HttpContext.Current.Response.Write(ex.Message);
    HttpContext.Current.Response.End();
   }
   finally
   {
    sw.Close();
   }
   return true;
  }
 }

三种方法比较起来生成速度由慢到快,易操作性则由简到繁。还请根据实际情况选择合适的方法。

[  收  集  ] :

view plaincopy to clipboardprint?
protected override void Render(HtmlTextWriter writer)  
{  
    System.IO.StringWriter html = new System.IO.StringWriter();  
    System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);  
    base.Render(tw);  
    System.IO.StreamWriter sw;  
    sw = new System.IO.StreamWriter(Server.MapPath("default.html"), false, System.Text.Encoding.Default);  
    sw.Write(html.ToString());  
    sw.Close();  
    tw.Close();  
    Response.Write(html.ToString());  
}   
protected override void Render(HtmlTextWriter writer)
{
    System.IO.StringWriter html = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);
    base.Render(tw);
    System.IO.StreamWriter sw;
    sw = new System.IO.StreamWriter(Server.MapPath("default.html"), false, System.Text.Encoding.Default);
    sw.Write(html.ToString());
    sw.Close();
    tw.Close();
    Response.Write(html.ToString());
}   

view plaincopy to clipboardprint?
使用ASP.NET生成静态页面的方法有两种,第一种是使用C#在后台硬编码,第二种是读取模板文件,使用字符串替换的方法。第一种方法编码量大,而且维护比较困难。我重点讲解第二种方法。第二种方法的基本思路是:使用DW之类的工具生成一个静态页面模板。读取该模板文件,然后对里面的特殊标记使用真实的数据替换掉,并生成一个HTML文件  
请看代码  
1.C#  
 
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Xml;  
using System.IO;  
 
namespace htmlWeb  
{  
   public class CreateHtm  
    {  
        
 
       private string fileName;  
 
       public String FileName  
       {  
           get { return fileName; }  
       }  
       /**//// <summary>  
       /// 读取配置文件  
       /// </summary>  
       /// <param name="dirName">配置文件的路径名</param>  
       /// <param name="tag">配置文件中的标签名</param>  
       /// <returns>_replaceStr的长度</returns>  
       private int GetConfig(String dirName, String tag)  
       {  
           XmlDataDocument config = new XmlDataDocument();  
           try 
           {  
               config.Load(dirName);  
           }  
           catch (Exception ex)  
           {  
               throw ex;  
           }  
           XmlNodeList list = config.GetElementsByTagName(tag);  
           return list.Count;  
       }  
        /**//// <summary>  
        ///生成HTML文件  
        /// </summary>  
        /// <param name="configFileName">配置文件的路径名</param>  
        /// <param name="configTag">配置文件中的标签名</param>  
        /// <param name="dir">生成文件所在的文件夹的路径</param>  
       /// <param name="templateFile">模板文件的的路径</param>  
        /// <param name="param">要替换的字符串数组</param>  
        /// <returns>生成的文件名</returns>  
       public void MakeHtml(String configFileName, String configTag, String dir, String templateFile, String[] param)  
       {  
           fileName = null;  
           int count = GetConfig(configFileName, configTag);  
           String[] _replaceStr = new String[count];  
           try 
           {  
               FileStream tFile = File.Open(templateFile, FileMode.Open, FileAccess.Read);  
               StreamReader reader = new StreamReader(tFile, Encoding.GetEncoding("gb2312"));  
               StringBuilder sb = new StringBuilder(reader.ReadToEnd());  
               reader.Close();  
               for (int i = 0; i < count; i++)  
               {  
                   sb.Replace("$repalce[" + i + "]$", param[i]);  
               }  
 
               fileName = DateTime.Now.ToFileTime().ToString() + ".htm";  
 
               FileStream rFile = File.Create(dir+"/" + fileName);  
               StreamWriter writer = new StreamWriter(rFile, Encoding.GetEncoding("gb2312"));  
               writer.Write(sb.ToString());  
               writer.Flush();  
               writer.Close();  
                 
               
 
 
           }  
           catch (Exception ex)  
           {  
               throw ex;  
           }  
 
 
       }  
 
       public void DeleteHtml(String dirName)  
       {  
           File.Delete(dirName);  
       }  
   }  
}  
 
  private int GetConfig(String dirName, String tag) 此方法用于读取配置文件(见后),主要是获得要替换的字符串的个数,在本类同体现为一个字符串数组  
    public void MakeHtml(String configFileName, String configTag, String dir, String templateFile, String[] param) 此方法用于生成静态页面  
51.52行创建一个字符数组,数组长度为配置文件中的节点个数。55-58行读取模板文件,并用读到的模板文件的HTML代码生成一个StringBuilder对象。59-62行使用StringBuilderd对象的repalce()方法替换标记“$repalce[i]$"为真实的数据  
64行生成一个唯一的文件名(防止覆盖)66-70行把新的字符串写到文件中。这样就生成了一个静态文件了。  
下面看一个使用的实例:  
一个文章管理系统,利用这个类来生成静态页面。  
首先,建立一个配置文件 config.xml.此文件告诉使用者每个标记的含义。如下  
<?xml version="1.0" encoding="utf-8" ?>  
<htmlWeb version="1">  
  <config>  
    <article key="0" value="title"/>  
    <article key="1" value="author"/>  
    <article key="2" value="context"/>  
    <aritcle key="3" value="date"/>  
  </config>  
</htmlWeb>   
10这样配置后,类会把标记数组0,1,2,3的位置分别替换为题目,作者,内容,发布日期。  
看模板文件  
 1<head>  
 2<title>模板文件</title>  
 3</head>  
 4<body>  
 5<h1>这是一个简单的HTML页,朋友们可以根据自己的需要重新设计</h1>  
 6<li>标题:$replace[0]$</li>  
 7<li>作者:$replace[1]$</li>  
 8<li>内容:$repalce[2]$</li>  
 9<li>时间:$repalce[3]$</li>  
10</body>使用方法:  
 1using System;  
 2using System.Data;  
 3using System.Configuration;  
 4using System.Web;  
 5using System.Web.Security;  
 6using System.Web.UI;  
 7using System.Web.UI.WebControls;  
 8using System.Web.UI.WebControls.WebParts;  
 9using System.Web.UI.HtmlControls;  
10  
11namespace UseT  
12{  
13    public class Test{  
14      
15     public void main(){       
16     string[] param = new string[4];  
17     param[0] = "测试模板";  
18     param[1] = "农佳捷";  
19     param[2] = "这是一个测试文章";  
20     param[3] = "2007-10-30";  
21       
22     htmlWeb.CreateHtm cs = new htmlWeb.CreateHtm();  
23     cs.MakeHtml("配置文件的路径  
24“, ”article“, ”生成文件的路径“, "模板文件的路径", param)  
25       
26    }  
27    }  
28}  
29只要把相应的参数修改为实际的值,就生成静态文件了。

 

 

 转载自:http://www.cnblogs.com/haik/archive/2010/07/03/1770677.html