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 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 Response.Redirect(newUrl, true); } else { // Default behavior } } // Flag render event { 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 { internal MyHtmlTextWriter(TextWriter tw) : base(tw) { } } // publish the HTMLwriter { get { return htmlWriter; } } // constructor initializes stringwriter and htmlwriter based on that // initialize Url { html = new StringWriter(); htmlWriter = new MyHtmlTextWriter(html); } internal void WriteHTMLFile(string virtualFileName) { // Stringreader reads output rendered by asp.net // Stringwriter writes html output file StringWriter sw = new StringWriter(); // Read from input while (htmlLine != null) { //// Filter out ASp.net specific tags // htmlLine } // Write contents stringwriter to html file //StreamWriter f=new StreamWriter( fs.Close(); } } |