我这里只写几个常用的事件
1.OnPreInit:此事件后将加载个性化信息和主题
2.OnInit:初始化页面中服务器控件的默认值但控件的状态没有加载,没有创建控件树
3.OnPreLoad:控件完成状态和回传数据的加载
4.Page_Load:此事件是在OnInit中订阅的
5.Render:呈现最终页面的内容

假设有一个文章数据库
以前都是通过article.aspx?id=123的动态形式访问的
现在我们想要减轻服务器压力,把文章生成静态文件
先看article.aspx的程序


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Text;
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;//StringWriter名称空间 namespace _1
{
    public partial class article : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!string.IsNullOrEmpty(Request["id"]))
            Label1.Text = "文章内容为:"+ Request["id"].ToString();
        }         protected override void Render(HtmlTextWriter writer)
        {
            StringWriter sw = new StringWriter();//这个和StringBuilder没太大区别
            HtmlTextWriter htmlw = new HtmlTextWriter(sw);
            base.Render(htmlw);//不用传递进来的writer
            htmlw.Flush();
            htmlw.Close();
            string PageContent = sw.ToString();
            string path = Server.MapPath("~/Article/");
            string pageurl = xland.MyModule.GetFileName(HttpContext.Current);
            using (StreamWriter stringWriter = File.AppendText(path + pageurl))
            {
                stringWriter.Write(PageContent);
            }
            Response.Write(PageContent);
        }
    }
}
 

我们还是通过自定义httpModules来实现url重写
webconfig文件没有太大变化


<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true"></compilation>
    <httpModules>
      <add name="myModule" type="xland.MyModule" />
    </httpModules>
    </system.web>
</configuration>

MyModule程序


using System;
using System.Collections.Generic;
using System.Web;//引用web命名空间
using System.Text;
using System.IO; namespace xland
{
    public class MyModule:IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest +=new EventHandler(context_BeginRequest);
        }
        public void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
            //AppRelativeCurrentExecutionFilePath这里不包括传过来的参数
            if (context.Request.AppRelativeCurrentExecutionFilePath.ToLower().EndsWith(".aspx"))
            {
                string fileurl = "~/article/" + GetFileName(context);
                if (File.Exists(context.Server.MapPath(fileurl)))
                {
                    context.RewritePath(fileurl, false);
                }
            }
        }
        public static string GetFileName(HttpContext context)
        {
            return context.Request.AppRelativeCurrentExecutionFilePath.ToLower().Replace(".aspx", "").Replace("~/", "") + context.Request.Url.Query.Replace("?id=", "_") + ".html";
        }
        public void Dispose() { }
    }
}

注释就不多写了,相信大家能看懂

这个示例程序只是为了说明page类的Render事件
如果要用到项目中,请慎重
因为会造成大量的服务器IO
而且这也不是生成静态页面的最佳方案

三:理解Page类的运行机制(例:在render方法中生成静态文件)的更多相关文章

  1. 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)

    有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我 ...

  2. 五:理解控件的运行机制(例:基于Control命名空间的简单控件)

    一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写 2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 Sy ...

  3. 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)

    一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次 ...

  4. 六:理解控件的运行机制(例:基于WebControl命名空间的控件)

    Control类的Render方法在WebControl类中被被分成三部分1:RenderBeginTag,呈现标签的开始2:RenderContents,呈现标签的内容3:RenderEndTag, ...

  5. 二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)

    url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article ...

  6. 七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)

    组合控件与WebControl控件的事件和属性相差不大组合控件,顾名思义就是把一些控件组合起来形成一个控件这个控件将包含这些控件称为他的子控件 CompositeControl类实现了INameCon ...

  7. 全面理解Java异常的运行机制

    1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...

  8. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

  9. 一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)

    初学JAVA,学一门语言不仅仅是学其语法,逻辑思维能力,还有每一门语言都有自己独特的一方面,所以才有那么多语言要学啊 = =,所以想要真的学好语言,其编译机制,运行机制多少也要涉猎一些啊.这是初学JA ...

随机推荐

  1. JS库汇总[重要]

    库名称  说明 附加说明 URI 一款js 操作URL的插件 功能十分强大.可以增加 .修改.删除.参数   1.Animate.css 2.Hover.css 3.jQuery 4.WebUploa ...

  2. 学习c++需要知道

    1.c++投入和经济产出比目前较低,c++很复杂,学习难度高.周期长.而且开发效率低. 2.但是c++趋紧于完美语言,它囊括了多种编程范型.它运行效率高,对计算机有着极致的控制能力.适用于低层. 3. ...

  3. java锁类型

    转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...

  4. hdu 1059

    题目大意:就是有价值1.2.3.4.5.6的硬币各多少个,然后让你判断能否把他们分成价值相等的两部分. 题目思路:目测dp,一看果然dp,完全背包,需要剪枝,硬币个数为容量,下标为value,用一个b ...

  5. hdu 5083 有坑+字符串模拟水题

    http://acm.hdu.edu.cn/showproblem.php?pid=5083 机器码和操作互相转化 注意SET还要判断末5位不为0输出Error #pragma comment(lin ...

  6. docker opencpu R

    有一个项目中用到了docker opencpu R,这里把所学的整理下. docker,一个运行容器,搭建一次,以后可以很方便的移植,win7 64下也可以装. opencpu,云端计算,运行R函数和 ...

  7. Linux命令行获取本机外网IP地址

    问题: 服务器地址为net映射地址,本机ifconfig无法直接获取映射的公网地址. 方法: [root@TiaoBan- nidongde]# curl http://ifconfig.me 50. ...

  8. 一致性hash(整理版)

    简单解释: 简单解释一致性hash的原理:网上通篇都是用服务器做的举例,我这里也如此,主要是便于理解. 通常:有N个客户端请求服务器,假设有M台web服务器,通常为了均衡访问会进行N%M的取模,然后分 ...

  9. [转载]腾讯专家:论高级DBA的自我修养

    作者介绍: 张秀云:2007年开始从事运维方面的工作,经历过网络管理员.linux运维工程师.DBA.分布式存储运维等多个IT职位.对linux运维.mysql数据库.分布式存储有丰富的经验.2012 ...

  10. NODE-WEBKIT教程(5)NATIVE UI API 之FRAMELESS WINDOW

    node-webkit教程(5)Native UI API 之Frameless window 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/4/15/n ...