首页 > 代码库 > Asp.net 生成静态页面

Asp.net 生成静态页面

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

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

    开发步骤:

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

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

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

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

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

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

      部分代码:

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.IO; namespace Eshop.Web.UI {     /// <summary>     /// 路径映射     /// </summary>     public static class UrlMapping     {         //Aspx 转换到 Html         public static string AspxToHtml(string url)         {             //判断路径是否为空             if (string.IsNullOrEmpty(url))             {                 throw new ArgumentNullException("路径不能为空");             }             //分割路径             string[] temp = url.Split(‘?‘);             if (temp.Length != 1 && temp.Length != 2)             {                 throw new ArgumentException(String.Format("路径 {0} 及其参数错误", url));             }             //获取路径后缀             string ext = Path.GetExtension(temp[0]);                if (!(ext.Equals(".aspx", StringComparison.OrdinalIgnoreCase)))             {                 throw new ArgumentException(String.Format("路径 {0} 类型必须为ASPX", url));             }             //截取.aspx中前面的内容             int offset = temp[0].LastIndexOf(‘.‘);             string resource = temp[0].Substring(0, offset);             //路径不带参数时             if (temp.Length == 1 || string.IsNullOrEmpty(temp[1]))             {                 return string.Format("{0}.html", resource);    //拼接             }             //路径带参数时             return string.Format("{0}___{1}.html", resource, temp[1]); //拼接         }                 //Html 转换到 Aspx         public static string HtmlToAspx(string url)         {             //判断路径是否为空             if (string.IsNullOrEmpty(url))             {                 throw new ArgumentNullException("路径不能为空");             }             string ext = Path.GetExtension(url);             if (!(ext.Equals(".html", StringComparison.OrdinalIgnoreCase)))             {                 throw new ArgumentException(String.Format("路径 {0} 类型必须为HTML", url));             }             string[] temp = url.Split(new String[] { "___", "." }, StringSplitOptions.RemoveEmptyEntries);             if (temp.Length == 2)             {                 return string.Format("{0}.aspx", temp[0]);             }             if (temp.Length == 3)             {                 return String.Format("{0}.aspx?{1}", temp[0], temp[1]);             }             throw new ArgumentException(String.Format("资源 {0} 及其参数错误", url));         }     } } 

  

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.IO; namespace Eshop.Web.UI {     /// <summary>     /// 静态网页保存     /// </summary>     public class FilterStream : Stream     {         private Stream respStream = null;         private Stream fileStream = null;         public FilterStream(Stream respStream, string filePath)         {             if (respStream == null)                 throw new ArgumentNullException("输出流不能为空");             this.respStream = respStream;                         try             {                 this.fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);  //写入到文件夹中             }             catch { }         }         public override bool CanRead         {             get { return this.respStream.CanRead; }         }         public override bool CanSeek         {             get { return this.respStream.CanSeek; }         }         public override bool CanWrite         {             get { return this.respStream.CanWrite; }         }         public override void Flush()         {             this.respStream.Flush();             if (this.fileStream != null)             {                 this.fileStream.Flush();             }         }         public override long Length         {             get { return this.respStream.Length; }         }         public override long Position         {             get             {                 return this.respStream.Position;             }             set             {                 this.respStream.Position = value;                 if (this.fileStream != null)                 {                     this.fileStream.Position = value;                 }             }         }         public override int Read(byte[] buffer, int offset, int count)         {             return this.respStream.Read(buffer, offset, count);         }         public override long Seek(long offset, SeekOrigin origin)         {             if (this.fileStream != null)             {                 this.fileStream.Seek(offset, origin);             }             return this.respStream.Seek(offset, origin);         }         public override void SetLength(long value)         {             this.respStream.SetLength(value);             if (this.fileStream != null)             {                 this.fileStream.SetLength(value);             }         }         public override void Write(byte[] buffer, int offset, int count)         {             this.respStream.Write(buffer, offset, count);             if (this.fileStream != null)             {                 this.fileStream.Write(buffer, offset, count);             }         }         protected override void Dispose(bool disposing)         {             base.Dispose(disposing);             this.respStream.Dispose();             if (this.fileStream != null)             {                 this.fileStream.Dispose();             }         }     } } 

  

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.IO; namespace Eshop.Web.UI {     /// <summary>     /// 哪个页面想静态化,就继承这个类     /// </summary>     public class HtmlPage:Page     {         // <summary>         /// 获取物理路径,判断文件夹中有没有存在这个文件         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容         /// 存在的话,就直接显示页面         /// </summary>         public override void ProcessRequest(HttpContext context)         {             HttpRequest req = context.Request;             HttpResponse resp = context.Response;             string htmlPage = UrlMapping.AspxToHtml(req.RawUrl);             string htmlFile = context.Server.MapPath(htmlPage);             if (File.Exists(htmlFile))             {                 resp.Redirect(htmlPage);                 return;             }             // Html 页面不存在             resp.Filter = new FilterStream(resp.Filter, htmlFile);             base.ProcessRequest(context);         }     } } 

  

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.IO; namespace Eshop.Web.UI  {     /// <summary>     /// 后缀为HTML的,都经这里处理     /// web.config     /// <remove verb="*" path="*.HTML"/>     /// <add verb="*" path="*.HTML" type="Eshop.Web.UI.HtmlHandler,AspxToHtmlDemo"/>     /// </summary>     public class HtmlHandler:IHttpHandler     {         public bool IsReusable         {             get { return false; }         }         /// <summary>         /// 获取物理路径,判断文件夹中有没有存在这个文件         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容         /// 存在的话,就直接显示页面         /// </summary>         public void ProcessRequest(HttpContext context)         {             HttpRequest request = context.Request;             HttpResponse response = context.Response;             string htmlPage = request.RawUrl;             string htmlFile = context.Server.MapPath(htmlPage);             if (File.Exists(htmlFile))             {                 response.WriteFile(htmlFile);                 return;             }             //Html 文件不存在             string aspxPage = UrlMapping.HtmlToAspx(htmlPage);             response.Redirect(aspxPage);         }     } } 

  

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Eshop.Web.Index" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">     <title>AspxToHtml Demo</title> </head> <body>     <form id="form1" runat="server">     <div>         <h1>AspxToHtml Demo</h1>         <br />                 <html:HtmlPanel ID="hp" runat="server">             <asp:HyperLink ID="Hy" runat="server" NavigateUrl="~/Index.aspx?page=2">                    点击             </asp:HyperLink>             <br />             <a href="http://www.mamicode.com/~/Index.aspx?page=2" runat="server">Hello</a>         </html:HtmlPanel>     </div>     </form> </body> </html>