第一次发表,有什么错误,请大家谅解噢!
如果不明白的话,建议自己拷一次。 就会的了。。
开发步骤:
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>
Asp.net 生成静态页面
时间: 2024-10-16 16:51:27