会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
Advance .Net
导航
博客园
首页
新随笔
联系
订阅
管理
公告
asp.net页面静态化
将asp.net页面静态化有很大意义,在些我就不多说了,实现asp.net页面静态化有很多种方面,在此我介绍一种在asp.net内实现的方法。大家都知道,每个asp.net页面都有一个特定的类对其进行处理,默认情况下该类是从Page类派生的。我们所要做的就是从Page类派生自己的类改写特定的方法。具体实现如下:
using
System;
using
System.Data;
using
System.Configuration;
using
System.Linq;
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.Xml.Linq;
using
System.IO;
public
class
FreezablePage : System.Web.UI.Page
{
//
When Asp.Net renders the page the Page.Render method is invoked
//
Override the method to hook in
protected
void
Page_Load(
object
sender, EventArgs e)
{
//
Response.HeaderEncoding = System.Text.Encoding.UTF8;
//
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Freeze(
string
.Format(
@"
{0}.htm
"
, Request.Url.ToString()));
}
protected
override
void
Render(HtmlTextWriter writer)
{
if
(freeze)
{
MyHtmlFileCreator htmlFile
=
new
MyHtmlFileCreator();
//
Let Asp.net render the output, catch it in the file creator
base
.Render(htmlFile.RenderHere);
newUrl
=
HttpContext.Current.Request.Url.AbsolutePath.ToString();
newUrl
=
newUrl.Replace(
"
.aspx
"
,
"
.htm
"
);
//
Response.HeaderEncoding = System.Text.Encoding.UTF8;
//
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
//
Write new html file
htmlFile.WriteHTMLFile(Server.MapPath(newUrl));
//
Redirect
Response.Redirect(newUrl,
true
);
}
else
{
//
Default behavior
base
.Render(writer);
}
}
//
Flag render event
protected
void
Freeze()
{
freeze
=
true
;
}
protected
void
Freeze(
string
toUrl)
{
freeze
=
true
;
NewUrl
=
toUrl;
}
private
bool
freeze
=
false
;
private
string
newUrl;
internal
string
NewUrl
{
get
{
return
newUrl;
}
set
{
newUrl
=
value;
}
}
}
internal
class
MyHtmlFileCreator
{
private
StringWriter html;
private
MyHtmlTextWriter htmlWriter;
//
override the HtmlTextWriter to reach the constructor
//
the constructor in the base class is protected
class
MyHtmlTextWriter : HtmlTextWriter
{
internal
MyHtmlTextWriter(TextWriter tw) :
base
(tw)
{ }
}
//
publish the HTMLwriter
internal
HtmlTextWriter RenderHere
{
get
{
return
htmlWriter; }
}
//
constructor initializes stringwriter and htmlwriter based on that
//
initialize Url
internal
MyHtmlFileCreator()
{
html
=
new
StringWriter();
htmlWriter
=
new
MyHtmlTextWriter(html);
}
internal
void
WriteHTMLFile(
string
virtualFileName)
{
//
Stringreader reads output rendered by asp.net
//
Stringwriter writes html output file
StringReader sr
=
new
StringReader(html.ToString());
StringWriter sw
=
new
StringWriter();
//
Read from input
string
htmlLine
=
sr.ReadLine();
while
(htmlLine
!=
null
)
{
/**/
///
/ Filter out ASp.net specific tags
//
if (!((htmlLine.IndexOf("<form") > 0) ||
//
(htmlLine.IndexOf("__VIEWSTATE") > 0) ||
//
(htmlLine.IndexOf("</form>") > 0)))
//
{ sw.WriteLine(htmlLine); }
sw.WriteLine(htmlLine);
htmlLine
=
sr.ReadLine();
}
//
Write contents stringwriter to html file
StreamWriter fs
=
new
StreamWriter(virtualFileName,
false
,System.Text.Encoding.UTF8);
//
StreamWriter f=new StreamWriter(
fs.Write(sw.ToString());
fs.Close();
}
}
你只要用此类做为你的页面的基类就可实现页面的静态化了,但此方法有一个缺点,就是他频繁的读写文件,会造成性能的下降,那么有没有更好的方法呢,答案是有肯定的。具体如何实现请请关注我的下篇文章。
posted on
2008-05-07 10:40
胡振
阅读(
6719
) 评论(
6
)
收藏
举报
刷新页面
返回顶部