很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件
有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。
今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。
HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。

声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!

作者:武眉博<活靶子.NET>
同时首发于:
    落伍者   && 博客园  
    开发者学院   && .Net男孩社区
知识点: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. 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. //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html
  8. //参考UrlRewriteModule.cs
  9. if (context.Items["ToStaticUrlItem"] == null)
  10. {
  11. if (!File.Exists(context.Request.PhysicalPath))
  12. {
  13. throw new HttpException(404, "您访问的页面没有找到。");
  14. }
  15. // asp.net 1.1 采用下面方法编译页面
  16. //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context);
  17. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler;
  18. hander.ProcessRequest(context);
  19. return;
  20. }
  21. string filePath;
  22. urlItem = (Url)context.Items["ToStaticUrlItem"];
  23. Regex regex = new Regex(
  24. Globals.ApplicationPath + urlItem.LookFor,
  25. RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
  26. string requestFile = 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. string inputFile = context.Request.PhysicalApplicationPath + filePath;
  36. string path = 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.net 1.1 采用下面方法编译页面
  49. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
  50. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
  51. hander.ProcessRequest(context);
  52. return;
  53. }
  54. if (!File.Exists(path))
  55. {
  56. // asp.net 1.1 采用下面方法编译页面
  57. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
  58. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
  59. hander.ProcessRequest(context);
  60. context.Response.Filter = new AspxBoy.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. FileInfo fileInfo = new FileInfo(path);
  70. if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now)
  71. {
  72. fileInfo.Delete();
  73. // asp.net 1.1 采用下面方法编译页面
  74. //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
  75. IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
  76. hander.ProcessRequest(context);
  77. context.Response.Filter = new AspxBoy.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://files.cnblogs.com/huobazi/BuildHtmlDemo.rar

转载于:https://www.cnblogs.com/huobazi/archive/2007/12/31/UrlRewriteAndHttpHanderAndMakeStaticHtmlFiles.html

[2007最后一博]Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件...相关推荐

  1. php重写地址,php url地址重写

    地址重写: urlRewrite: 就是:  1. 将php的地址index.php不写只写Action模块和function方法, 或者 2. php地址转变成html地址, 就是一种假的html, ...

  2. Apache的URL地址重写 RewriteCond与RewriteRule

    Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将 ...

  3. Apache的URL地址重写(RewriteCond与RewriteRule)

    Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将 ...

  4. cookie与session详解、url地址重写

    cookie与session详解.url地址重写:https://www.cnblogs.com/l199616j/p/11195667.html

  5. apache2.2.21下为codeigniter配置url地址重写

    2019独角兽企业重金招聘Python工程师标准>>> apache2.2.21下为codeigniter配置url地址重写 1.首先打开apache的配置文件,httpd.conf ...

  6. Urlrewrite(url地址重写)和UrlRewriteFilter

    Urlrewrite(url地址重写)和UrlRewriteFilter Urlrewrite: urlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址 UrlRewr ...

  7. JAVA WEB项目隐藏url真实路径,url地址重写UrlRewriteFilter

    有这么一种情况,不想让别人知道你项目访问的真实url,或者为了让url方便记忆,想用自己想用的url,该怎么办呢? 1.隐藏url的真实路径 2.url的重写 UrlRewriteFilter可以完美 ...

  8. php url地址 怎么写,php url地址重写

    地址重写: urlRewrite: 就是:  1. 将php的地址index.php不写只写Action模块和function方法, 或者 2. php地址转变成html地址, 就是一种假的html, ...

  9. php获取url地址的方法,PHP获取当前页面完整url地址的方法

    php获取当前页面完整真实的url地址的方法,包括带参数的,总结了三种方法,大家可以根据需要选择,具体函数代码如下: 第一种方法: function GetCurUrl(){if(isset($_SE ...

最新文章

  1. java跳转语句包含goto_Java 语句标签实现goto跳转
  2. linux Pytorch C++ 环境搭建
  3. 15. 3Sum_左右开工,遍历找出符合目标的数字
  4. 智慧城市同城V4小程序独立版v1.6.5+前端
  5. redis并发锁 thinkphp5_资深架构师经典总结:Redis分布式锁实现理解
  6. jfinal 源码中文乱码解决
  7. seaborn—sns.residplot绘制线性回归的残差
  8. Linux系统解决SSH登录慢的详细步骤
  9. 量子计算(四):量子力学的发展史
  10. 华为业务流程管理体系
  11. MVX Android设计架构浅析-MVC
  12. 关于数据库having的用法的详细介绍
  13. eclipse/UAP debug模式
  14. 【求职】瓜子C++方向面经
  15. 笔记:RTSP在线视频流资源地址
  16. 基于MATLAB的Kmeans聚类算法的仿真与分析
  17. EditText内容格式化控件 XEditText 和 输入内容过滤器
  18. LeetCode 1053. 交换一次的先前排列(贪心法)
  19. 阿语python,五一放假通知
  20. 密码学之累加器【笔记】

热门文章

  1. 数据库安全性相关知识笔记​
  2. 后端:414 Request-URI Too Large解决方案
  3. python字典append_python中字典重复赋值,append到list中引发的异常
  4. matlab中select,[转载]MATLAB阈值获取函数ddencmp、thselect、wbmpen和w
  5. Java 之HashSet、LinkedHashSet、TreeSet比较
  6. 源码群友问:你这么多项目是怎么进行技术选型的?
  7. 【无套路送书】架构师是怎样炼成的?
  8. mysql 相关子查询使用【主表得数据需要扩展(统计数据依赖与其他表,但是与主表有关联)】...
  9. BZOJ4825: [Hnoi2017]单旋(Splay)
  10. 为什么要“男孩穷养、女孩富养”