http://www.cnblogs.com/tonycall/archive/2009/07/18/1526079.html

第一次发表,有什么错误,请大家谅解噢!

如果不明白的话,建议自己拷一次。 就会的了。。

开发步骤:

1、路径映射类(UrlMapping),主要对路径进行拆分、拼接。(关键的一步)

2、过滤流类(FilterStream),主要负责生成静态页面。

3、静态页面类(HtmlPage),主要是调用UrlMapping和FilterStream类,

哪个页面想静态化,就继承这个类。

4、HtmlHandler类,路径后缀为Html的,都由它来处理,与HtmlPage类相似。

5、HtmlPanel类(控件),页面带上这个控件,超链接会静态化。(详情请下载源码包)

部分代码:

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.HtmlControls;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.IO;
  11.  
  12. namespace Eshop.Web.UI
  13. {
  14.     /// <summary>
  15.     /// 路径映射
  16.     /// </summary>
  17.     public static class UrlMapping
  18.     {
  19.         //Aspx 转换到 Html
  20.         public static string AspxToHtml(string url)
  21.         {
  22.             //判断路径是否为空
  23.             if (string.IsNullOrEmpty(url))
  24.             {
  25.                 throw new ArgumentNullException("路径不能为空");
  26.             }
  27.  
  28.             //分割路径
  29.             string[] temp = url.Split('?');
  30.  
  31.             if (temp.Length !=  && temp.Length != )
  32.             {
  33.                 throw new ArgumentException(String.Format("路径 {0} 及其参数错误", url));
  34.             }
  35.  
  36.             //获取路径后缀
  37.             string ext = Path.GetExtension(temp[]);    
  38.             if (!(ext.Equals(".aspx", StringComparison.OrdinalIgnoreCase)))
  39.             {
  40.                 throw new ArgumentException(String.Format("路径 {0} 类型必须为ASPX", url));
  41.             }
  42.  
  43.             //截取.aspx中前面的内容
  44.             int offset = temp[].LastIndexOf('.');
  45.             string resource = temp[].Substring(, offset);
  46.  
  47.             //路径不带参数时
  48.             if (temp.Length ==  || string.IsNullOrEmpty(temp[]))
  49.             {
  50.                 return string.Format("{0}.html", resource);    //拼接
  51.             }
  52.  
  53.             //路径带参数时
  54.             return string.Format("{0}___{1}.html", resource, temp[]); //拼接
  55.         }
  56.         
  57.         //Html 转换到 Aspx
  58.         public static string HtmlToAspx(string url)
  59.         {
  60.             //判断路径是否为空
  61.             if (string.IsNullOrEmpty(url))
  62.             {
  63.                 throw new ArgumentNullException("路径不能为空");
  64.             }
  65.  
  66.             string ext = Path.GetExtension(url);
  67.             if (!(ext.Equals(".html", StringComparison.OrdinalIgnoreCase)))
  68.             {
  69.                 throw new ArgumentException(String.Format("路径 {0} 类型必须为HTML", url));
  70.             }
  71.  
  72.             string[] temp = url.Split(new String[] { "___", "." }, StringSplitOptions.RemoveEmptyEntries);
  73.             if (temp.Length == )
  74.             {
  75.                 return string.Format("{0}.aspx", temp[]);
  76.             }
  77.  
  78.             if (temp.Length == )
  79.             {
  80.                 return String.Format("{0}.aspx?{1}", temp[], temp[]);
  81.             }
  82.  
  83.             throw new ArgumentException(String.Format("资源 {0} 及其参数错误", url));
  84.         }
  85.     }
  86. }
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.HtmlControls;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.IO;
  11.  
  12. namespace Eshop.Web.UI
  13. {
  14.     /// <summary>
  15.     /// 静态网页保存
  16.     /// </summary>
  17.     public class FilterStream : Stream
  18.     {
  19.         private Stream respStream = null;
  20.         private Stream fileStream = null;
  21.  
  22.         public FilterStream(Stream respStream, string filePath)
  23.         {
  24.             if (respStream == null)
  25.                 throw new ArgumentNullException("输出流不能为空");
  26.  
  27.             this.respStream = respStream;
  28.             
  29.             try
  30.             {
  31.                 this.fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);  //写入到文件夹中
  32.             }
  33.             catch { }
  34.         }
  35.  
  36.         public override bool CanRead
  37.         {
  38.             get { return this.respStream.CanRead; }
  39.         }
  40.  
  41.         public override bool CanSeek
  42.         {
  43.             get { return this.respStream.CanSeek; }
  44.         }
  45.  
  46.         public override bool CanWrite
  47.         {
  48.             get { return this.respStream.CanWrite; }
  49.         }
  50.  
  51.         public override void Flush()
  52.         {
  53.             this.respStream.Flush();
  54.  
  55.             if (this.fileStream != null)
  56.             {
  57.                 this.fileStream.Flush();
  58.             }
  59.         }
  60.  
  61.         public override long Length
  62.         {
  63.             get { return this.respStream.Length; }
  64.         }
  65.  
  66.         public override long Position
  67.         {
  68.             get
  69.             {
  70.                 return this.respStream.Position;
  71.             }
  72.             set
  73.             {
  74.                 this.respStream.Position = value;
  75.  
  76.                 if (this.fileStream != null)
  77.                 {
  78.                     this.fileStream.Position = value;
  79.                 }
  80.             }
  81.         }
  82.  
  83.         public override int Read(byte[] buffer, int offset, int count)
  84.         {
  85.             return this.respStream.Read(buffer, offset, count);
  86.         }
  87.  
  88.         public override long Seek(long offset, SeekOrigin origin)
  89.         {
  90.             if (this.fileStream != null)
  91.             {
  92.                 this.fileStream.Seek(offset, origin);
  93.             }
  94.  
  95.             return this.respStream.Seek(offset, origin);
  96.         }
  97.  
  98.         public override void SetLength(long value)
  99.         {
  100.             this.respStream.SetLength(value);
  101.  
  102.             if (this.fileStream != null)
  103.             {
  104.                 this.fileStream.SetLength(value);
  105.             }
  106.         }
  107.  
  108.         public override void Write(byte[] buffer, int offset, int count)
  109.         {
  110.             this.respStream.Write(buffer, offset, count);
  111.  
  112.             if (this.fileStream != null)
  113.             {
  114.                 this.fileStream.Write(buffer, offset, count);
  115.             }
  116.         }
  117.  
  118.         protected override void Dispose(bool disposing)
  119.         {
  120.             base.Dispose(disposing);
  121.  
  122.             this.respStream.Dispose();
  123.             if (this.fileStream != null)
  124.             {
  125.                 this.fileStream.Dispose();
  126.             }
  127.         }
  128.     }
  129. }
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.HtmlControls;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.IO;
  11.  
  12. namespace Eshop.Web.UI
  13. {
  14.     /// <summary>
  15.     /// 哪个页面想静态化,就继承这个类
  16.     /// </summary>
  17.     public class HtmlPage:Page
  18.     {
  19.         // <summary>
  20.         /// 获取物理路径,判断文件夹中有没有存在这个文件
  21.         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
  22.         /// 存在的话,就直接显示页面
  23.         /// </summary>
  24.         public override void ProcessRequest(HttpContext context)
  25.         {
  26.             HttpRequest req = context.Request;
  27.             HttpResponse resp = context.Response;
  28.  
  29.             string htmlPage = UrlMapping.AspxToHtml(req.RawUrl);
  30.             string htmlFile = context.Server.MapPath(htmlPage);
  31.  
  32.             if (File.Exists(htmlFile))
  33.             {
  34.                 resp.Redirect(htmlPage);
  35.                 return;
  36.             }
  37.  
  38.             // Html 页面不存在
  39.             resp.Filter = new FilterStream(resp.Filter, htmlFile);
  40.             base.ProcessRequest(context);
  41.         }
  42.     }
  43. }
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.HtmlControls;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.IO;
  11.  
  12. namespace Eshop.Web.UI  
  13. {
  14.     /// <summary>
  15.     /// 后缀为HTML的,都经这里处理
  16.     /// web.config
  17.     /// <remove verb="*" path="*.HTML"/>
  18.     /// <add verb="*" path="*.HTML" type="Eshop.Web.UI.HtmlHandler,AspxToHtmlDemo"/>
  19.     /// </summary>
  20.     public class HtmlHandler:IHttpHandler
  21.     {
  22.         public bool IsReusable
  23.         {
  24.             get { return false; }
  25.         }
  26.  
  27.         /// <summary>
  28.         /// 获取物理路径,判断文件夹中有没有存在这个文件
  29.         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
  30.         /// 存在的话,就直接显示页面
  31.         /// </summary>
  32.         public void ProcessRequest(HttpContext context)
  33.         {
  34.             HttpRequest request = context.Request;
  35.             HttpResponse response = context.Response;
  36.  
  37.             string htmlPage = request.RawUrl;
  38.             string htmlFile = context.Server.MapPath(htmlPage);
  39.  
  40.             if (File.Exists(htmlFile))
  41.             {
  42.                 response.WriteFile(htmlFile);
  43.                 return;
  44.             }
  45.  
  46.             //Html 文件不存在
  47.             string aspxPage = UrlMapping.HtmlToAspx(htmlPage);
  48.             response.Redirect(aspxPage);
  49.         }
  50.  
  51.     }
  52. }
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Eshop.Web.Index" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml" >
  6. <head runat="server">
  7.     <title>AspxToHtml Demo</title>
  8. </head>
  9. <body>
  10.     <form id="form1" runat="server">
  11.     <div>
  12.         <h1>AspxToHtml Demo</h1>
  13.         <br />
  14.         
  15.         <html:HtmlPanel ID="hp" runat="server">
  16.             <asp:HyperLink ID="Hy" runat="server" NavigateUrl="~/Index.aspx?page=2">
  17.                    点击
  18.             </asp:HyperLink>
  19.             <br />
  20.             <a href="~/Index.aspx?page=2" runat="server">Hello</a>
  21.         </html:HtmlPanel>
  22.     </div>
  23.     </form>
  24. </body>
  25. </html>

源码包:   /Files/tonycall/AspxToHtmlDemo.zip

Asp.net 生成静态页面的更多相关文章

  1. 三种C#.net生成静态页面的方法

    ASP.NET生成静态页面方法主要有三种   第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...

  2. asp.net配置全局应用程序类 巧妙达到定时生成静态页面

    //在项目里添加一个"全局应用程序类(Global Application Class)",在里面写这样的代码: public class Global : System.Web. ...

  3. .NET生成静态页面并分页

    因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态 ...

  4. .net 生成 静态页面

    .net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...

  5. .NET生成静态页面例子

    主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...

  6. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  7. C#根据网址生成静态页面

    HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...

  8. 用 Smarty 生成静态页面入门介绍

    why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...

  9. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

随机推荐

  1. bzoj 3473 后缀自动机多字符串的子串处理方法

    后缀自动机处理多字符串字串相关问题. 首先,和后缀数组一样,用分割符连接各字符串,然后建一个后缀自动机. 我们定义一个节点代表的字符串为它原本代表的所有串去除包含分割符后的串.每个节点代表的字符串的数 ...

  2. python开发_tkinter_单选按钮

    这篇blog主要是描述python中tkinter的单选按钮操作 下面是我做的demo 运行效果: ====================================== 代码部分: ===== ...

  3. hdoj 5199 Gunner map

    Gunner Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5199 D ...

  4. Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索

    Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec  Memory Limit: 512 MBSubmit: xxx  ...

  5. Codeforces 505A Mr. Kitayuta's Gift 暴力

    A. Mr. Kitayuta's Gift time limit per test 1 second memory limit per test 256 megabytes input standa ...

  6. 记一次centos7.2下用crontab执行定时任务的过程(初级)

    实验目的:每分钟往某个文件写数据(crontab最小单位是分钟),具体shell命令我是放在一个文件里的.先创建两个空文件:/tmp/a.txt(目标文件)和/tmp/a.sh(脚本文件). 命令如下 ...

  7. HTTP协议中 POST和GET的区别

    http://blog.csdn.net/whuslei/article/details/6667095 权威点的说明请参考:http://www.cs.tut.fi/~jkorpela/forms/ ...

  8. [MySql]锁表与解锁

    摘要 为啥会出现锁表的情况?锁表会导致数据表的其他操作超时,频繁的插入修改查询很容易出现锁表的情况.如果遇到这种情况,临时的解决办法,可以通过下面的方式进行解锁.如果长期有效的解决,那么就需要优化项目 ...

  9. firedac使用UNIXODBC连接SQLSERVER

    firedac使用UNIXODBC连接SQLSERVER 1)下载 SQL SERVER ODBC DRIVER FOR 64-BIT LINUX. 如果你有旧版mssql 工具安装,请删除任何较旧的 ...

  10. sqlserver 创建用户仅仅能訪问指定视图

    use crm --当前数据库创建角色 exec sp_addrole 'rapp' --分配视图权限 GRANT SELECT  ON veiw TO [角色] --指定视图列表 GRANT SEL ...