zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    mysql之创建数据库,创建数据表
    mysql之group by,order by
    一个人选出2门以上不及格的课程sql语句
    GIt入门
    数据库索引工作原理
    题目:50个人围城一圈数到3和3的倍数时出圈,问剩下的人是谁?原来的位置是多少?
    约瑟夫环:递归算法
    K-means算法的java实现,聚类分析681个三国武将
    java用一个for循环输出99乘法表
    写一个基于UDP协议的聊天小程序
  • 原文地址:https://www.cnblogs.com/jameslif/p/3895308.html
Copyright © 2011-2022 走看看