在ASP.NET动态页中生成静态页面

介绍了一种通过生成静态页面来减轻服务器压力的方法,利用 ASP.NET 的 Page 类进行扩展,实现了页面缓存功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在有的时候为了提高服务器的性能,在客户端访问动态页面的时候,可以让其访问生成的静态页面(当然也可用缓存,可这样比较耗资源),这样可以大大的提高访问速度,也能减轻服务器的压力。其实在网上搜索一下,便有很多这样的例子,我这里要列出的是,在我们项目中用到的方法。

 

       首先是基类继承至Page类,一般这种类也叫中间类,将共有的功能在此类中实现,然后让其他类去继承,将达到简化代码的目的。

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.IO;

namespace CommonLib.CreateStatePage
{
    public abstract class StatePage:Page
    {
        private StringWriter htmlPage;
        public StatePage()
        { }
        protected override void Render(HtmlTextWriter writer)
        {
            htmlPage = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(htmlPage);         
            base.Render(htw);  
            CreatePage(StatePageFilePath());
            ReturnPage(StatePageFileUrl());           
        }

        protected override void OnInit(EventArgs e)
        {
            GetOnInit();
            if (!IsRefresh(StatePageFilePath()))
            {
                ReturnPage(StatePageFileUrl());
            }
            base.OnInit(e);
        }
       
        private void CreatePage(string filePath)
        {          
                StreamWriter filesw = new StreamWriter(filePath, false, Encoding.GetEncoding("UTF-8"));
                filesw.Write(htmlPage);
                filesw.Close();           
        }

        private bool IsRefresh(string filepath)
        {
            if (File.Exists(filepath) && GetRefreshMinute() == 0)
            {
                return false;
            }
            else if (File.Exists(filepath) && new FileInfo(filepath).LastWriteTime.AddMinutes(GetRefreshMinute()) >= DateTime.Now)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private void ReturnPage(string pageUrl)
        {
            Response.Redirect(pageUrl);
        }
     
        protected abstract string StatePageFilePath();

        protected abstract string StatePageFileUrl();

        protected abstract double GetRefreshMinute();

        protected abstract void GetOnInit();
      
    }
}

 

 

现在看看子类吧,也就是具体的页面了。

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

 

public partial class _Default : CommonLib.CreateStatePage.StatePage  
{
    private string areaid = "";
    protected void Page_Load(object sender, EventArgs e)
    {

 

      Label1.Text= DateTime.Now.ToLongDateString()+DateTime.Now.ToLongTimeString();
     
    }

 

    //★★实现父类中的抽象方法,返回具体存放静态页面的文件路径

    protected override string StatePageFilePath()
    {
        return "D://Web//CommonLib//test//aa.htm";
    }

    //★★实现父类中的抽象方法,返回访问静态页面时的URL

    protected override string StatePageFileUrl()
    {
        return "~/aa.htm";
    }

    //★★实现父类中的抽象方法,返回多长时间刷新静态页面,单位是分钟

    protected override double GetRefreshMinute()
    {
        return 10;
    }

    //★★实现父类中的抽象方法,初始化某些资源

    protected override void GetOnInit()
    {
    }
}

 

      经过上面的设置,当我们访问Default.aspx页面时,首先程序会将Default.aspx页面生成aa.htm,并用WEB/aa.heml的虚拟路径映射到此静态页面。并且相隔10分钟之后才会刷新动态页面,这样服务器每隔10分钟才会有一次交互,大大的减轻了服务器的压力哟!

       

        

…… 2.asp.net代码:   //---------------------读html模板页面到stringbuilder对象里----   string[] format=new string[4];//定义和htmlyem标记数目一致的数组   StringBuilder htmltext=new StringBuilder();   try   {    using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名"))    {   String line;   while ((line = sr.ReadLine()) != null)   {    htmltext.Append(line);   }   sr.Close();    }   }   catch   {    Response.Write("<Script>alert('读取文件错误')</Script>");   }   //---------------------给标记数组赋值------------   format[0]="background="bg.jpg"";//背景图片   format[1]= "#990099";//字体颜色   format[2]="150px";//字体大小   format[3]= "<marquee>生成的模板html页面</marquee>";//文字说明   //----------替换htm里的标记为你想加的内容   for(int i=0;i<4;i )   {    htmltext.Replace("$htmlformat[" i "]",format[i]);   }   //----------生成htm文件------------------――   try   {    using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312")))   {    sw.WriteLine(htmltext);    sw.Flush();    sw.Close();   }   }   catch   {   Response.Write ("The file could not be wirte:");   }   小结   用此方法可以方便的生成html文件。程序使用了是循环替换,因此对需替换大量元素的模板速度非常快。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值