【IT168技术文档】
很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件,有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。
今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。
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文件 }
1. public void ProcessRequest(HttpContext context) 2. { 3. string rawUrl = context.Request.RawUrl; 4. string requestPath = context.Request.Path; 5. string applicationPath = context.Request.ApplicationPath; 6. Url urlItem = null; 7. 8. //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html 9. //参考UrlRewriteModule.cs 10. if (context.Items["ToStaticUrlItem"] == null) 11. { 12. if (!File.Exists(context.Request.PhysicalPath)) 13. { 14. throw new HttpException(404, "您访问的页面没有找到。"); 15. } 16. 17. // asp.net 1.1 采用下面方法编译页面 18. //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context); 19. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler; 20. hander.ProcessRequest(context); 21. 22. return; 23. } 24. 25. string filePath; 26. 27. urlItem = (Url)context.Items["ToStaticUrlItem"]; 28. 29. Regex regex = new Regex( 30. Globals.ApplicationPath + urlItem.LookFor, 31. RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase); 32. 33. string requestFile = regex.Replace(rawUrl, Globals.ApplicationPath + urlItem.WriteTo.Replace("^", "&")); 34. 35. if (requestFile.IndexOf("?") > 0) 36. { 37. filePath = requestFile.Substring(0, requestFile.IndexOf("?")); 38. } 39. else 40. { 41. filePath = requestFile; 42. } 43. 44. string inputFile = context.Request.PhysicalApplicationPath + filePath; 45. string path = context.Request.PhysicalApplicationPath + rawUrl.ToLower().Replace(".aspx", ".html"); 46. if (applicationPath != "/") 47. { 48. inputFile = inputFile.Replace(applicationPath + "/", @"\"); 49. path = path.Replace(applicationPath + "/", "").Replace("/", @"\"); 50. } 51. else 52. { 53. path = path.Replace("/", @"\"); 54. } 55. 56. if (!urlItem.EnabledToStatic) 57. { 58. // asp.net 1.1 采用下面方法编译页面 59. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context ); 60. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler; 61. hander.ProcessRequest(context); 62. 63. return; 64. } 65. 66. if (!File.Exists(path)) 67. { 68. // asp.net 1.1 采用下面方法编译页面 69. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context ); 70. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler; 71. hander.ProcessRequest(context); 72. context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path); 73. 74. return; 75. } 76. 77. if (urlItem.Minutes == Int32.MaxValue) 78. { 79. context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html")); 80. } 81. else 82. { 83. FileInfo fileInfo = new FileInfo(path); 84. if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now) 85. { 86. fileInfo.Delete(); 87. 88. // asp.net 1.1 采用下面方法编译页面 89. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context ); 90. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler; 91. hander.ProcessRequest(context); 92. context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path); 93. } 94. else 95. { 96. context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html")); 97. } 98. return; 99. } 100. }