为了实现静态化页,我在博客园里可是搜了半天。最后找到两个方案:
那么这两种那个好呢?嘿嘿,本人的办法是,两种都实现,然后自己选择。是啊,不试一试怎么知道哪种效率更好。
实现方面没啥多说的,基本和两位的办法差不多。但是在生成静态页时,我用的既不是filter的办法,也不是webclient的那种采集式的方法。因为我的系统比较特殊,是DNN式的单页面系统。所以,最佳的实现方法,是孟子E章的重写Render方法的办法。原来很简单,先将Render执行的结果保存在字符串里,然后保存到文件里,最后在Response.write。
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的情况,大可以放心使用。主要代码:
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页,否则根本无法使用。
最后要感谢两位前辈趟出来的路,才能实现得比较顺利。