Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件

知识点: UrlRewriteIHttpModuleIHttpHander 的编写
效果:
http://www.devedu.com/Doc/DotNet/AspNet/default.2.aspx
http://www.devedu.com/Doc/DotNet/AspNet/default.2.html
思路:
1 挂载“.aspx"的请求到自定义的Httphander内
2 配置URL重写规则
3 访问某.aspx文件时,在HttpHander内 根据配置确定是否应该生成
接着...
if(需要生成)
{
if(若已经生成html文件 )
{
if(文件并未过期)
{
则直接定向(Server.Transfer())。
}
else
{
删除HTML文件;
重新编译.aspx(Page内数据库操作等等)
生成HTML文件;
}
}
else if(尚未生成文件)
{
生成Html。
}
}
else
{
则编译.aspx文件
}

另:建议阅读一下dudu的blog中关于asp.net页面编译的讨论
http://www.cnblogs.com/dudu/archive/2006/03/07/345107.html
http://www.cnblogs.com/dudu/archive/2006/03/07/344351.html

部分代码


C#代码
  1. publicvoidProcessRequest(HttpContextcontext)
  2. {
  3. stringrawUrl=context.Request.RawUrl;
  4. stringrequestPath=context.Request.Path;
  5. stringapplicationPath=context.Request.ApplicationPath;
  6. UrlurlItem=null;
  7. //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html
  8. //参考UrlRewriteModule.cs
  9. if(context.Items["ToStaticUrlItem"]==null)
  10. {
  11. if(!File.Exists(context.Request.PhysicalPath))
  12. {
  13. thrownewHttpException(404,"您访问的页面没有找到。");
  14. }
  15. //asp.net1.1采用下面方法编译页面
  16. //PageParser.GetCompiledPageInstance(requestPath,context.Request.PhysicalPath,context).ProcessRequest(context);
  17. IHttpHandlerhander=BuildManager.CreateInstanceFromVirtualPath(requestPath,typeof(Page))asIHttpHandler;
  18. hander.ProcessRequest(context);
  19. return;
  20. }
  21. stringfilePath;
  22. urlItem=(Url)context.Items["ToStaticUrlItem"];
  23. Regexregex=newRegex(
  24. Globals.ApplicationPath+urlItem.LookFor,
  25. RegexOptions.CultureInvariant|RegexOptions.Singleline|RegexOptions.Compiled|RegexOptions.IgnoreCase);
  26. stringrequestFile=regex.Replace(rawUrl,Globals.ApplicationPath+urlItem.WriteTo.Replace("^","&"));
  27. if(requestFile.IndexOf("?")>0)
  28. {
  29. filePath=requestFile.Substring(0,requestFile.IndexOf("?"));
  30. }
  31. else
  32. {
  33. filePath=requestFile;
  34. }
  35. stringinputFile=context.Request.PhysicalApplicationPath+filePath;
  36. stringpath=context.Request.PhysicalApplicationPath+rawUrl.ToLower().Replace(".aspx",".html");
  37. if(applicationPath!="/")
  38. {
  39. inputFile=inputFile.Replace(applicationPath+"/",@"/");
  40. path=path.Replace(applicationPath+"/","").Replace("/",@"/");
  41. }
  42. else
  43. {
  44. path=path.Replace("/",@"/");
  45. }
  46. if(!urlItem.EnabledToStatic)
  47. {
  48. //asp.net1.1采用下面方法编译页面
  49. //PageParser.GetCompiledPageInstance(filePath,inputFile,context).ProcessRequest(context);
  50. IHttpHandlerhander=BuildManager.CreateInstanceFromVirtualPath(filePath,typeof(Page))asIHttpHandler;
  51. hander.ProcessRequest(context);
  52. return;
  53. }
  54. if(!File.Exists(path))
  55. {
  56. //asp.net1.1采用下面方法编译页面
  57. //PageParser.GetCompiledPageInstance(filePath,inputFile,context).ProcessRequest(context);
  58. IHttpHandlerhander=BuildManager.CreateInstanceFromVirtualPath(filePath,typeof(Page))asIHttpHandler;
  59. hander.ProcessRequest(context);
  60. context.Response.Filter=newAspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter,path);
  61. return;
  62. }
  63. if(urlItem.Minutes==Int32.MaxValue)
  64. {
  65. context.Server.Transfer(rawUrl.ToLower().Replace(".aspx",".html"));
  66. }
  67. else
  68. {
  69. FileInfofileInfo=newFileInfo(path);
  70. if(fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes)<DateTime.Now)
  71. {
  72. fileInfo.Delete();
  73. //asp.net1.1采用下面方法编译页面
  74. //PageParser.GetCompiledPageInstance(filePath,inputFile,context).ProcessRequest(context);
  75. IHttpHandlerhander=BuildManager.CreateInstanceFromVirtualPath(filePath,typeof(Page))asIHttpHandler;
  76. hander.ProcessRequest(context);
  77. context.Response.Filter=newAspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter,path);
  78. }
  79. else
  80. {
  81. context.Server.Transfer(rawUrl.ToLower().Replace(".aspx",".html"));
  82. }
  83. return;
  84. }
  85. }
示例项目下载: http://www.cnblogs.com/Files/huobazi/BuildHtmlDemo.rar

你可能感兴趣的:(html)