生成静态页3 使用定时器定时生成静态页
前面两篇文章讨论的是如何生成静态页,谈了常用的两种方法, 即:模板替换法与ASPX页面输出到静态文件。
下面要谈的问题是何时生成静态页?依我的个人经验,我是这样认为的:
模板替换法:主要适用于最终页的静态页生成,如产品展示页,新闻显示页,职位描述及个人简历显示等。它们的特点是,一经生成,基本不变的内容。我建议在添加与编辑这些内容时,就生成静态页比较合适。对于其它情况,我建议看下面内容。
ASPX页直接输出到静态页:主要适合于内容经常会变的页,由于访问量大,实时性要高,需要经常生成。这时我们直接将ASPX页输出到静态页就比较方便,编程与生成静态面互不干饶,用户访问的一直是静态页,效率也非常高。那么什么时候生成比较合适?大家都比较关心。我看有人使用这种办法,就是用户在访问到ASPX页时,加一个判断,如果静态页存在,并且时间不长(如小于5分钟)。让其转向静态页,否则生成静态页。这样做,服务器还是要做很多工作,效率不高。
我建议,用户在访问时及网上的超连接,直接使用静态页。我们用定时程序来控制生成静态页,也就是在我们站点内启动一个时钟,让其定时执行生成静态页。效率比较高些。当然也会存在一个问题。就是在用户不访问时,定时程序仍然会运行,占用服务器时间,但是,我认为这种开销非常少。另外,我们是来解决访问量大,实时性高的大中型网站。我认为这点问题在这个目标下不能算是问题了。代码如下,供大家参考:
public class ConfigHtml
{
public static System.Timers.Timer htmlTimer = new System.Timers.Timer(60000);
/// 应用程序根目录(物理根目录 如:e:\web\)
public static string RootPath = null;
/// 应用程序URL根目录(如:http://www.bestwl.com/)
public static string RootUrl = null;
private static int GenCount = 0;
static ConfigHtml()
{
//初始化应用程序根目录(物理根目录 如:e:\web\)
RootPath = Common.GetMapPath("/") ;
//初始化应用程序URL根目录(如:http://www.bestwl.com/)
RootUrl = "http://" + HttpContext.Current.Request.Url.Authority + Common.AppName;
htmlTimer.AutoReset = true;
htmlTimer.Enabled = true;
htmlTimer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
htmlTimer.Start();
}
private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//生成测试静态文件
string fileName = null;
//例:如果5分钟生成一次静态文件,则使用如下代码
if (GenCount % 5 == 0)
{
fileName = RootPath + "index.htm";
CreateStaticHtml(RootUrl + "index.aspx", fileName);
}
#region 设置时钟发生次数
//设置发生次数,每触发一次GenCount加1,当GenCount大于100时,归零。
if (GenCount > 100)
GenCount = 0;
else
GenCount++;
#endregion
}
/// 生成静态文件方法,外部可调用
/// http://www.bestwl.com/index.aspx
///
public static void CreateStaticHtml(string url, string toFile)
{
StreamReader sr;
StreamWriter sw;
WebRequest HttpWebRequest1 = WebRequest.Create(url);
WebResponse HttpWebResponse1 = HttpWebRequest1.GetResponse();
sr = new StreamReader(HttpWebResponse1.GetResponseStream(), System.Text.Encoding.UTF8);
string strHtml = sr.ReadToEnd();
sw = File.CreateText(toFile);
sw.WriteLine(strHtml);
sw.Close();
}
}