示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0
刘岛的Blog
本人原创文章及作品发布区,与51aspx相关内容已经转移到这里,也希望大家一如既往地支持51aspx.com的发展
posts - 89,  comments - 490,  trackbacks - 51

现在很多网站特别是资讯类的都把内容生成静态页(htm\html\shtml等),这类总结了一下两种生成静态页的方法并做了一个Demo文件供大家下载。

分别是通过模板(比较常用)和根据url生成(不到万部则以不用,因为这中方式只能获取html的部分):

Asp.net生成静态文件(根据时间自动命名保持,默认扩展名是htm可以自行修改)。

通过收入内容替换模板或者url地址两种方式进行静态文件的生成

templete.htm为模板文件,htm为生成后的静态文件保存位置

这类粘贴出.cs文件

  1 //51aspx.com生成静态页演示文件,转载请保留该信息
  2    public partial class _Default : System.Web.UI.Page
  3    {
  4        protected void Page_Load(object sender, EventArgs e)
  5        {
  6           
  7        }

  8
  9        //根据模板生成,保持在html文件夹中(部分源码搜集于网络)
 10        protected void Button1_Click(object sender, EventArgs e)
 11        {
 12            //源码是替换掉模板中的特征字符
 13
 14            string mbPath =Server.MapPath("template.htm");
 15            Encoding code = Encoding.GetEncoding("gb2312");
 16            StreamReader sr = null;
 17            StreamWriter sw = null;
 18            string str = null;
 19
 20            //读取
 21            try
 22            {
 23                sr = new StreamReader(mbPath, code);
 24                str = sr.ReadToEnd();
 25
 26            }

 27            catch (Exception ex)
 28            {
 29                throw ex;
 30            }

 31            finally
 32            {
 33                sr.Close();
 34            }

 35
 36            //根据时间自动重命名,扩展名也可以自行修改
 37            string fileName = DateTime.Now.ToString("yyyyMMddHHmmss"+ ".htm";
 38            str = str.Replace("$title$", txtTitle.Text);//替换Title
 39            str = str.Replace("$content$", txtContent.Text);//替换content
 40
 41            //生成静态文件
 42            try
 43            {
 44                sw = new StreamWriter(Server.MapPath("htm/"+ fileName, false, code);
 45                sw.Write(str);
 46                sw.Flush();
 47
 48            }

 49            catch (Exception ex)
 50            {
 51                throw ex;
 52            }

 53            finally
 54            {
 55                sw.Close();
 56                Response.Write("恭喜<a href=htm/"+fileName+" target=_blank>"+fileName+"</a>已经生成,保存在htm文件夹下!");
 57            }

 58
 59
 60        }

 61
 62
 63        //根据Url地址生成静态页保持
 64        protected void Button2_Click(object sender, EventArgs e)
 65        {
 66            Encoding code = Encoding.GetEncoding("utf-8");
 67            StreamReader sr = null;
 68            StreamWriter sw = null;
 69            string str = null;
 70
 71            //读取远程路径
 72            WebRequest temp = WebRequest.Create(txtUrl.Text.Trim());
 73            WebResponse myTemp = temp.GetResponse();
 74            sr = new StreamReader(myTemp.GetResponseStream(), code);
 75            //读取
 76            try
 77            {
 78                sr = new StreamReader(myTemp.GetResponseStream(), code);
 79                str = sr.ReadToEnd();
 80
 81            }

 82            catch (Exception ex)
 83            {
 84                throw ex;
 85            }

 86            finally
 87            {
 88                sr.Close();
 89            }

 90            string fileName = DateTime.Now.ToString("yyyyMMddHHmmss"+ ".htm";
 91
 92            //写入
 93            try
 94            {
 95                sw = new StreamWriter(Server.MapPath("htm/"+ fileName, false, code);
 96                sw.Write(str);
 97                sw.Flush();
 98
 99            }

100            catch (Exception ex)
101            {
102                throw ex;
103            }

104            finally
105            {
106                sw.Close();
107                Response.Write("恭喜<a href=htm/" + fileName + " target=_blank>" + fileName + "</a>已经生成,保存在htm文件夹下!");
108            }

109
110        }

111    }

只是一个Demo文件,仅供大家参考,也希望有其他生成方式的也讨论一下(部分源码搜集于网络)

完整项目下载地址

-----------------
E路有我 任你纵横

posted on 2007-05-16 10:38 liudao 阅读(6943) 评论(58)  编辑 收藏 网摘 所属分类: .net功能源码

FeedBack:
2007-05-16 10:58 | Artech      
最常见的一种做法是,把资讯的内容写成XML格式的Feed 文件,Editor可以随时修改内容和添加,通过一个XSLT的Template每隔一定时间(这个时间可以自己设定)把Feed转换成static HTML到固定的Url。
  回复  引用  查看    
2007-05-16 10:58 | sd[未注册用户]
sf
  回复  引用    
#4楼[楼主]
2007-05-16 11:02 | 51aspx.com      
@Artech
对你的思路很感兴趣,能给些资料么?

  回复  引用  查看    
2007-05-16 11:10 | .net开发资源中心[未注册用户]
谢谢分享,已引用,把“分布是”改为“分别是”了:)

http://***/gb2312/blogs/20070516/176/Asp_net生成htm静态文件的两种途径.aspx

  回复  引用    
2007-05-16 11:13 | 大豆男生      
收藏
  回复  引用  查看    
2007-05-16 11:14 | .net开发资源中心[未注册用户]
Artech 说的应该是批量生成,把相关内容、标题、内容描述、关键词及要生成的网页名等录入到一个类似于XML Feed结构的表内,隔一段时间获取这些内容批量生成相关页面。自己没做过,只是猜测!
  回复  引用    
#8楼[楼主]
2007-05-16 11:20 | 51aspx.com      
@.net开发资源中心
谢谢,已纠正!

  回复  引用  查看    
2007-05-16 11:48 | 星月横空[未注册用户]
生成静态页面好处是防止数据库的访问减少服务器压力

如果仅仅是为了搜索引擎的话 还是用重写URL比较好
毕竟都是有利有弊的
但个人认为 如果是独立的服务器 还是URL重写比较好

  回复  引用    
2007-05-16 11:50 | Artech      
@51aspx.com
@.net开发资源中心
其实很多网站都是采用这样的发布方式,比如MSN。他们的网页大多都是静态的Html。他们有一套自己的开发和发布平台。

比如他们把一个通过XSLT Template把Page划分为若干部分(所以他们的结构都大同小异,可以复用)。而每个部分也有属于自己的XSLT Template。
在开发的时候,只需要通过Infopath可视化地编写XML,这些XML通过XSLT Template的Transform转化成html。Page的所有内容都是这样凑起来的。由于XSLT Template是相对静态的,如果内容变化,通过InfoPath重新生成XML就可以了。

同时他们又一套发布引擎,可以设置一个schedule来设定每隔多少时间或者在某个具体的时间点进行一次XSLT的Transform,当然你也可以即时发布。

考虑的访问量巨大,他们一般都不用DB。除非要进行一些真正数据的操作。

  回复  引用  查看    
2007-05-16 12:40 | 生米煮成稀饭      
Artech
说的很对!

  回复  引用  查看    
2007-05-16 12:41 | 生米煮成稀饭      
Artech
微软的?or微软混过的?嘿嘿

  回复  引用  查看    
2007-05-16 14:09 | <>neilzhang      
to 生米煮成稀饭
地球人都知道了,不用非要微软的人才这样做。很简单的原理。

倒是 星月横空 的办法更适用一些常规网站。给我解决了大问题。

重写URL

  回复  引用  查看    
2007-05-16 15:06 | s3
@Artech
写个事例好不?

谢了,我是这样写的,不过,效果好象没你说的那么好。

差不多也就是个RSS在线阅读功能。

  回复  引用    
2007-05-16 15:24 | Artech      
@s3
一时半会也没有时间 写Sampe。不过我刚好有一篇功能相似的关于SQLXML 的Blog。
我的思路是,把通过SQLXML从SQL Server中以XML的形式获取数据,再以XSLT的转化成Html。那么你通过才Db中队数据库中数据的修改,可以马上反映到Page中。Url:http://www.cnblogs.com/artech/archive/2007/03/26/687769.html">http://www.cnblogs.com/artech/archive/2007/03/26/687769.html
但愿能为你带来帮助。

  回复  引用  查看    
2007-05-16 15:46 | ddr888      
好东西 收藏
顺便看看 邮件回复好了没?

  回复  引用  查看    
2007-05-16 16:00 | Clingingboy      
如果模板更新了呢?
  回复  引用  查看    
2007-05-16 16:07 | yang[未注册用户]
w
  回复  引用    
2007-05-16 16:26 | 狂人      
我以前手底下有一个程序员,他有一个让我哭笑不得的方法,就是正常做好页面,然后另写一个页面去做http请求,返回来的内容写入磁盘变成静态文件……

楼主的第二种方法大概就是这样的吧?

  回复  引用  查看    
#20楼[楼主]
2007-05-16 16:35 | 51aspx.com      
@狂人
第二种方法是这样的 只是在特殊情况下才用

不知道你们的那个程序员是不是用在了特殊情况 :)

  回复  引用  查看    
#21楼[楼主]
2007-05-16 16:35 | 51aspx.com      
@Clingingboy

模板更新以及涉及到分页的内容是我们下一步要做的
敬请关注!

  回复  引用  查看    
2007-05-16 16:37 | Clingingboy      
@51aspx.com
51aspx.com网站挺不错的

  回复  引用  查看    
2007-05-16 16:57 | 亚历山大同志      
用爬网的方式也不是不可以撒,也不必哭笑不得
  回复  引用  查看    
2007-05-16 17:18 | ddr888      
@狂人
真不知道你为什么哭笑不得?这种方法不好到哪里了?

为什么我预定了这篇文章,还是没有邮箱提示?是不是哪里出问题了?

  回复  引用  查看    
#25楼[楼主]
2007-05-16 17:21 | 51aspx.com      
@ddr888

估计狂人说的是这句“不到万不得已不用”

  回复  引用  查看    
2007-05-16 17:41 | Artech      
@51aspx.com
这个网站感觉不错。

  回复  引用  查看    
2007-05-16 20:28 | ***[未注册用户]
不错的网站
  回复  引用    
2007-05-16 21:51 | 布尔      
为什么没有考虑模板技术呢?
  回复  引用  查看    
2007-05-16 23:31 | Henry Liang      
@51aspx.com
@Artech
我感觉Artech所说的动态生成xml,定期用xsl转化为静态html,怎么听起来这么像asp.net自己的page cache功能呢?
对于cache,我的理解是,asp.net page如果设置了cache,则会在内存中cache该资源返回的html,下一个访问者就可以直接返回这个html而不必重新运行一遍。而cache可以根据时间或者数据库(sql server only)的更新而失效。
Artech说的MSN网站,只不过是把这个过程“手动”完成了而已。

  回复  引用  查看    
2007-05-16 23:54 | Reeezak      
用替换的方式??

有xslt为什么不用呢?毕竟需要转换的数据不会那么少,如果少的话,也不会对数据库造成什么影响了

  回复  引用  查看    
2007-05-17 00:37 | Artech      
@Henry Liang
我看你误解了,我所说的和Caching一点都不沾边。和ASP.NET也没有关系。只是在对数据显示结构不变,而数据本身随时改变的情况下,把数据保存为XML Feed,通过XSLT转化成HTML。
这是很常见的运用方式,难道我的表达有问题,会让你才生如此误解??

  回复  引用  查看    
2007-05-17 00:52 | Henry Liang      
@Artech
谢谢你的回复。
事实上,我的意思是,你说的方式和caching,两者使用的同一种mechanism。我并没有说你的方式“就是”caching。特此说明。
而且,我对你说的方法很有兴趣,因为我也正好有此方面的需要,正好研究一下。再加上xslt很方便,不光可以把xml转化成html,也可以转化成rss feed。在此我想请教一下,这么做会不会有什么潜在的问题?

  回复  引用  查看    
2007-05-17 04:05 | hfyb      
@Artech
通过XSLT转化成HTML这个方法好麻烦啊,XSLT不太会写,样式不知道好不好控制?你说的把数据保存为XML,不知道和从数据库中提取数据用FOR XML语句直接生成XML数据是不是一个道理?
还有最近想搞明白DATASET架构与XML文件转化到底怎么回事?两者可以互相转化吗?我有好多关于XML的问题请高手帮帮我:http://www.cnblogs.com/hfyb/archive/2007/05/14/745121.html">http://www.cnblogs.com/hfyb/archive/2007/05/14/745121.html

  回复  引用  查看    
#34楼[楼主]
2007-05-17 08:50 | 51aspx.com      
@Henry Liang
@hfyb
@Reeezak

我看了Artech的那篇文章,概况一下吧

实际是通过asp.net来直接读取Xml文件,而不直接和sql打交道,对于XML的读写是靠控制SQl来完成,这样读取的效率相对就比较高!

不知道概况的是否正确,请Artech点评!

  回复  引用  查看    
2007-05-17 09:46 | 枫之物语[未注册用户]
第二种方式,捕获动态页生成静态页,可以使用自定义http模块和urlrewriter在第一次访问时生成页面。比模板的方式更加灵活,可以生成任意页面而不需要写任何模板。
  回复  引用    
2007-05-17 10:29 | OK_008      
不错。学习。
  回复  引用  查看    
2007-05-17 11:25 | Artech      
@51aspx.com
其实文章的重点是如何使用MS的SQLXML 这个组件。我只是借助ASP.NET来调用这个组建而已。你也可以使用其它的方式来调用,比如Console App,只要最终生成你需要的html。

  回复  引用  查看    
2007-05-17 11:52 | 簡單就好      
生成文件不是也浪费硬盘空间啦..不好维护啦。。
  回复  引用  查看    
2007-05-17 11:59 | 静态文件[未注册用户]
@狂人
呵呵,也许你的那个程序员在使用你所不知道的方法而已,只不过没能好好运用,画虎不成反类犬了。

车东有一篇文章大概说的就是这种方法。

http://www.phpe.net/articles/366.shtml

  回复  引用    
2007-05-17 22:17 | Artech      
@Henry Liang
XML+XSLT是一种常用和高效的方式。XML已经成了一种标准,它不仅仅可以作为数据的容器,在分布式中,尤其在SOA中,更成为基于Message调用的封装形式。尽然XML如此流行,XSD,XSLT就会鸡犬升天:)。

我想不到有什么“潜在的问题”, 不知道你所说的那方面的“隐患”?

  回复  引用  查看    
2007-05-18 00:34 | Henry Liang      
@Artech
谢谢你的回应,并且也很感谢你提供的思路。
我所谓的潜在问题或者隐患,只是因为要应用于实际项目而产生的一些担心,并不是质疑你的方法,请你勿怪。打个比方,如果数据库十分庞大,那么产生的作为数据容器的xml也必然很大,在这种情况下,对xml执行xslt的select操作,不知道性能如何呢?和直接使用sql从数据库中读取的效率相比,哪一个更快?
谢谢指教。

  回复  引用  查看    
2007-05-18 01:36 | Artech      
@Henry Liang
呵呵,你太客气了,我很喜欢和别人讨论,和接受质疑。
因为在这个Blog我提出了两个方案,一个是纯XML feed,和SQL Server + SQLXML,所有有时候不知道针对哪一个:)

对于SQLXML他的工作的过程是这样的,假设我们现在的情况是Web server 访问SQL Server。
1. Web server向SQL Server发出查询,SQL Server在接受到请求之后,先执行查询并以RowSet(不是XML)返回结果,这一步和一般的SQL没有分别,第2步才是把RowSet转化成XML。所以他会比一般的SQL多出一步对Rowset向XML的转化,如果考虑到SQL Server的性能和吞吐量,我们可以把第二步放在Client端进行,也就是Web Server进行。SQLXML支持Server和Client两种XML Formatting。
2. 在SQLXML中会经常使用到Mapping Schema的XSD,频繁的存取该文件也会降低性能,所以我们一般采用Caching的机制。

如果使用到SQL Server作为数据源,由于我们实际上实现一个SQL Server中数据向XML(HTML)的转化问题,使用SQLXML是最直接的方式,毕竟MS就是为了这种需求才开发的SQLXML 组件。

至于XSLT对XML的转化,我觉得这真的是一种非常高效的转化方式,在性能方面,我觉得应该是最好的。

  回复  引用  查看    
2007-05-18 01:58 | Henry Liang      
@Artech
谢谢指教!我对SQLXML没什么了解,不过听你一说感觉很……interesting,待我好好研究一下再来讨教。
纯XML feed可能比较适合内容更新不太频繁的网站,可能不太适合我目前的需要。
再次感谢!

  回复  引用  查看    
#44楼[楼主]
2007-05-18 07:45 | 51aspx.com      
@Artech
@Henry Liang

通过你们的讨论我对SQLXML更感兴趣了,有机会一定研究一下用在51aspx上

  回复  引用  查看    
2007-05-18 12:44 | liyu[未注册用户]
hellow!
  回复  引用    
2007-05-18 13:13 | Artech      
@Henry Liang
@51aspx.com
我到觉得两种方式可以结合一起使用,先用SQLXML生成Feed,在用XSLT生成Html。 呵呵。

  回复  引用  查看    
2007-05-18 23:18 | 小春      
我个人倾向于XML+XSLT方式。现在当初开发的项目还在好好的运行着,早期没有注意XSLT的性能,运行一段时间之后会造成内存汇漏,当然已经解决:)

我们实际上只是将用户更新的数据存储数据库,并同时会将需要的数据直接通过MSMQ发送到指定的服务器上。服务端的Windows Service会定时通过MSMQ的方式获取数据,生成XML文档后直接生成静态文件,当然,我们因为还需要分页,所以会在所有静态文件生成完成之后会重新会访问数据库,计算分页的数据,然后在生成分页的静态页面。生成静态文件时候使用了多线程,所以性能还是很强的。

当初考虑MSMQ就是不想时时去数据库抓取数据。因为数据访问量比较大。
还有一点就是时时性,这会在第一时间更新静态文件和分页的数据

  回复  引用  查看    
2007-05-18 23:27 | 马可香蕉      
收藏
  回复  引用  查看    
2007-05-26 19:34 | 狂人      
@ddr888
方法可能不是错误的,毕竟现在流行“做聪明的程序员”。
我只所以哭笑不得,是因为作为一个项目Leader,我看到的是一种对项目不负责任的态度。
从技术层面上说,同样是写入到Stream中,明明可以直接写入到FileStream中,为什么要先写到Response.OutputStream,然后再Request进来,再写到FileStream呢?多出来的这些I/O操作可以说是脱裤子放P了。
采用这个模式实现缓存模块的程序员,只能说是ASP年代遗留下来的毛病,.NET的强大框架可以实现更具备灵活性的模块,却偏偏采用了这种明显是偷懒行为的模式,对于个人应用无所谓,但是对于一个正规的商业项目,我比较不能容忍团队的这种风气。

  回复  引用  查看    
2007-07-12 19:05 | fangyifeng[未注册用户]
@小春
我现在的想法和你的想法一样 但是不知道怎么着手去写,可以交流交流吗?
fangyifengde1007@hotmail.com

  回复  引用    
2007-07-16 17:01 | gao[未注册用户]
用replace的方法效率太差了
个人推荐用xsl转换 xml来实现,我们以前的团队就是用这样的方式实现了
很大的流量的网站。

可以做真正的mvc的效果,但有利有避,这种方式需要传统的提交表单,放弃了web控件的可视化,但也解决传统的叶面设计师的代码不能直接套用的缺点。

还有 XsltArgumentList 对象可以向xsl模版添加参数,还有对象可以添加
扩展对象,这样数据的表现形式不仅限于xml文件

但这样需要深入了解xsl 语言 。。。。哈哈

  回复  引用    
2007-07-16 19:35 | akada[未注册用户]
@gao

能不能给个xslt的例子啊?我好期待

  回复  引用    
2007-10-15 13:50 | 烟仔      
大家能不能给个XML和XSL的例子呀
  回复  引用  查看    
2007-12-06 10:48 | endision      
是呀,楼上的说的是,大家给个例子好不?
  回复  引用  查看    
2007-12-20 11:23 | tttt[未注册用户]
--引用--------------------------------------------------
生米煮成稀饭: Artech
说的很对!
--------------------------------------------------------
--引用--------------------------------------------------
endision: 是呀,楼上的说的是,大家给个例子好不?
--------------------------------------------------------
--引用--------------------------------------------------
烟仔: 大家能不能给个XML和XSL的例子呀
--------------------------------------------------------
@烟仔

  回复  引用    
2008-10-07 18:05 | 梁要要要[未注册用户]
我提供一段代码
功能: 保存指定URL的内容到html页

语言:VB.NET

环境:Visual Studio 2005

关键字:ASP.NET 生成 静态页 html

Dim errorMsg As String '声明保存错误信息的变量
Dim URL As String '声明保存网址的变量
URL = "http://www.cndev.org" '需要保存的网址
errorMsg = ""
Try
Dim wReq As System.Net.WebRequest
Dim wResp As System.Net.WebResponse
wReq = System.Net.WebRequest.Create(URL) '创建请求实例
wResp = wReq.GetResponse() '获取Response
Dim reader As System.IO.StreamReader = New System.IO.StreamReader(wResp.GetResponseStream, System.Text.Encoding.Default) '创建StreamReader实例,并设置源字符编码为默认
Dim writer As System.IO.StreamWriter = New System.IO.StreamWriter("F:\a.htm", False, System.Text.Encoding.GetEncoding("gb2312")) '创建StreamWriter实例 ,并设置目标字符编码为gb2312
'Response.Write(reader.ReadToEnd)
writer.Write(reader.ReadToEnd) '写入文件
writer.Flush() ' 将缓存内容写入文件
writer.Dispose() '释放实例
reader.Dispose() '释放实例
Catch ex As Exception
errorMsg = ex.Message
End Try

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 748155




相关文章:

相关链接:
本blog大部分源码来自
51aspx.com
转载请注明出处 同时哪些内容侵犯了您的权利,也希望你及时指出,我们会及时更正
园子的新LOGO不错,这次应该就这么定下来了,和discuz的那个有点相似

<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类

随笔档案

Asp.net资源

最新评论

阅读排行榜

评论排行榜

51Aspx.com 版权所有