• Asp.net 生成静态页面


    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类(控件),页面带上这个控件,超链接会静态化。(详情请下载源码包)

          部分代码:

     

          


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

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

  • 相关阅读:
    异步方法单元测试
    docker常用命令备忘
    MQ消息最终一致性解决方案(转载)
    JAVA学习知识杂烩
    ASP.NET Core快速入门(第2章:配置管理)- 学习笔记(转载)
    NETCore下IConfiguration和IOptions的用法(转载)
    ASP.NET Core 之 Identity 入门(转载)
    vue+elementui+netcore混合开发
    JWT签名与验签
    使用Machin公式计算
  • 原文地址:https://www.cnblogs.com/jingzhishen/p/3496440.html
Copyright © 2020-2023  润新知