君子意如何

我就是路人甲 http://www.dongdongyou.com/ 动动友

导航

探索自己实现页面基类.打造快速页面.

    在很多时候。我门需要一种页面。这种页面不需要回送。为了速度。不需要使用服务器控件。必须保持高响应。他只要做动态显示。有不能做成静态页面。比如一些vip的文章显示。投票查看了。

    webform框价功能强大。但是看看一个system.web.ui.page的源码。



[ToolboxItem(
false), DesignerSerializer("Microsoft.VisualStudio.Web.WebForms.WebFormCodeDomSerializer, Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a""System.ComponentModel.Design.Serialization.TypeCodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), DefaultEvent("Load"), Designer("Microsoft.VisualStudio.Web.WebForms.WebFormDesigner, Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"typeof(IRootDesigner)), DesignerCategory("ASPXCodeBehind"), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
public class Page : TemplateControl, IHttpHandler

 
 



不要忘记,*.cs内的类在继承了这个page类。最后*.aspx在编译成一个类 在继承*.cs内的类。 在编译*.aspx类的时候。会分析html字符串,把所有的html标签和文字写到类内。并用服务器控件的多少来分割他。最后建立一个控件树。

  现在我门的思路是这样的 。想要用一个类来完全实现页面输出。这个类不需要继承system.web.ui.page。个人觉得在管道上切入不现实。最后选择在http处理程序上入手。所有的请求在进入http处理程序以后,检测访问路径。通过不同的路径去调用不同类的实例。不同类的内部在调用不同的模板。或者直接输出。直接产生输出结果。在http处理程序上返回。

   我的想法是把处理工厂类封装起来。但是如何让所有的页面类在第一次访问前有一个实例,我想了好久,还是想不出好的办法。于是决定把处理工厂类开放出来。这样所有的问题就全解决。我们先在逻辑层定义一个处理工厂类


 

处理工厂类



    TempletHandler 类就是开放在外的处理工厂类 ,下面我门在配置文件内注册他

  <httpHandlers>
   
   <add verb="*" path="Run/*.aspx" type="BusinessTest.TempletHandler,BusinessTest"/>
   <add verb="*" path="Run/*.pdf" type="BusinessTest.TempletHandler,BusinessTest"/>
  </httpHandlers>

 表示在站点的run目录上所有的*.aspx文件和*.pdf文件全部转成我门的页面类处理。而实际上run目录上没有任何文件。


 case @"/WebSiteTest/Run/Test1.aspx":
       BackObject = new CreatTempletHandler();
这两句表示对/WebSiteTest/Run/Test1.aspx的请求 由CreatTempletHandler类处理。AddTempletClass函数一般只执行一次。在缓存没消失的情况下。他是不会被多次调用的。

CreatTempletHandler 类。他来全部负责/WebSiteTest/Run/Test1.aspx请求的输出。这种页面类只要继承BaseTempletHandler类就好了。页面布局你可以用模板来控制。显示你可以用标签来控制。当然要是想在提高速度。也可以不使用模板。并且不使用模板也绝对不会带来任何性能损失。

CreatTempletHandler,页面最终输出类的执行顺序是先是protected override void Page_Load(ref TempletReplet objILabel)函数执行。要是使用模板那在函数内部protected override void Page_Init(ref TempletReplet objILabel)函数被调用,记住Page_Init只执行一次。等Page_Load执行完毕以后 在执行其他的标签解析函数。最后 和成一个完整的页面输出。

 

第一个页面类


  这种方法页面和一般的继承page类的页面那个快,那个节省资源我没有做具体测试。其实这就是动态程序集。和内存中的对象在合并字符串速度上的比较。用页面类。可以保证在高并发情况下安全性 。就是80,90个请求同时到达,返回的结果绝对不会互相冲突。但是我没有加上多线程。应为我现在也搞不清楚在aspx页面并发很高的情况下。多线程异步回调是发生在那。处理管道上有管道池。那异步回调是发生在管道上,还是http处理程序上,或者是http处理模块上。或者是*.aspx编译成的类上。以后我加上多线程。对方法异步回调。这样我相信页面类的处理能力将更强大。

下载代码:/Files/vitality2007/Show.rar

 

 

 

 

posted on 2006-11-01 16:11  君子意如何  阅读(4929)  评论(12编辑  收藏  举报