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="~/Index.aspx?page=2" runat="server">Hello</a>
         </html:HtmlPanel>
     </div>
     </form>
 </body>
 </html>

  

posted on 2014-08-06 17:26  记性特差  阅读(159)  评论(0编辑  收藏  举报