注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路奔跑

奔跑着一路向前...

 
 
 

日志

 
 

Asp.net 生成静态页面(简单用法)  

2012-12-18 18:08:06|  分类: Asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

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

    开发步骤:

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

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

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

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

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

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

      部分代码:

      


Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑路径映射类
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));
        }
    }
}

 

 


Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑过滤流类
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();
            }
        }
    }
}

 

 


Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑静态页面类
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);
        }
    }
}

 

 


Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑HtmlHandler
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);
        }
    }
}

 


Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑Asp.net 生成静态页面(简单用法) - 誠者無敌 - 一路奔跑页面
<%@ 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>
  评论这张
 
阅读(191)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018