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 != && temp.Length != )
{
throw new ArgumentException(String.Format("路径 {0} 及其参数错误", url));
} //获取路径后缀
string ext = Path.GetExtension(temp[]);
if (!(ext.Equals(".aspx", StringComparison.OrdinalIgnoreCase)))
{
throw new ArgumentException(String.Format("路径 {0} 类型必须为ASPX", url));
} //截取.aspx中前面的内容
int offset = temp[].LastIndexOf('.');
string resource = temp[].Substring(, offset); //路径不带参数时
if (temp.Length == || string.IsNullOrEmpty(temp[]))
{
return string.Format("{0}.html", resource); //拼接
} //路径带参数时
return string.Format("{0}___{1}.html", resource, temp[]); //拼接
}
//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 == )
{
return string.Format("{0}.aspx", temp[]);
} if (temp.Length == )
{
return String.Format("{0}.aspx?{1}", temp[], temp[]);
} 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>
源码包: /Files/tonycall/AspxToHtmlDemo.zip
Asp.net 生成静态页面的更多相关文章
- 三种C#.net生成静态页面的方法
ASP.NET生成静态页面方法主要有三种 第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...
- asp.net配置全局应用程序类 巧妙达到定时生成静态页面
//在项目里添加一个"全局应用程序类(Global Application Class)",在里面写这样的代码: public class Global : System.Web. ...
- .NET生成静态页面并分页
因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态 ...
- .net 生成 静态页面
.net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...
- .NET生成静态页面例子
主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...
- 浅谈php生成静态页面
一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...
- C#根据网址生成静态页面
HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...
- 用 Smarty 生成静态页面入门介绍
why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...
- 比较详细PHP生成静态页面教程
一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...
随机推荐
- 51nod 1515 明辨是非 启发式合并
1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...
- mongodb exception in initAndListen: 12596 old lock file, terminating解决方法
错误信息如下: exception old lock file, terminating 解决方法 .删除data目录中的.lock文件 .mongod.exe --repair .启动mongod就 ...
- java跨域解决
import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Bea ...
- log4j用properties文件配置,无法应用过滤器的解决方法
properties文件仍然有错误 log4j:WARN Failed to set property [filter] to value "org.apache.log4j.varia.L ...
- iOS中安全结束 子线程 的方法
一个典型的结束子线程的方法: 用 isFinished 检测子线程是否被完全kill掉 -(IBAction)btnBack:(id)sender { //释放内存 仅仅remove 并不会触发内 ...
- 企业应用:C/S 开发需要考虑的事项
备注 几乎没有做过 C/S 方面的开发(有 RIA 方面的开发经验),此文纯属个人胡思乱想,写下来是希望朋友们多给点意见. C/S 开发注意事项 C/S 开发需要注意如下几点: 采用何种模式组织 UI ...
- SVN中的Trunk、Tag、Brance的用法
在SVN中Branch/tag在一个功能选项中,在使用中也往往产生混淆.在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别.至于何时用tag, ...
- ubuntu上minigui调试环境的建立
minigui一共有两个版本:商业版()和GPL版(),问了一下飞漫软件,使用商业版前期的费用是9万,有技术支持,包括5000个licenses的费用,后期10K的量的话,每个licenses要6块, ...
- 系统对接API调用
在与公司外部系统对接时,API接口一般采用REST风格,对外暴露HTTP服务.只需要将入参封装好,并发起HTTP请求即可.具体请求流程如下图所示: 数据格式 API调用参数分为系统参数和业务参数,请求 ...
- PHP语言基础之MySql 05 By ACReaper
PHP的基本语法学完后,我们马上学下PHP如何和MySql进行交互.PHP和MySql进行交互的API可以分为两类,一类是面向过程的,一类是面向对象的,面向对象的我们等复习完面向对象再介绍,现在先介绍 ...