一个asp.net Page的生死轮回

一个asp.net Page的生死轮回
2006年11月18日
17:13
 
     Osamede最近去codeplex上找了一些web project回家看,感觉非常好,也可以说是非常激动。于是就用从那些个project上学到的东西做了一个分类广告的site.,很是有点自豪。可是当我把原型写好,准备发布给朋友看的时候,突然感觉非常的迷茫。发布我的这些个page到底需要什么?从request到response是个什么过程?我的asp.net页面当然是要编译成Il的,但是到底什么时候编译,编译器在哪里?怎么调用?Ok,如果你也是一个菜鸟,有跟我一样的困惑,那么就跟我一块儿,来建立一个bird-view吧。
  2.1 召唤一个 asp.net
之所以用召唤这个词,是因为呈现给用户的一个asp.net页面是个暂时的对象,一般来说它是在用户需要的时候才生成的html流,就像游戏里召唤出的一个宠物,呵呵.
     按照msdn上的说法,asp.net当初设计的时候,就打算跟IIS相互独立,不依赖IIS的任何特征。也就是说IIS 和 ASP.net是俩个互不相干的实体,可以认为是俩个独立的进程。那么之间通信自然也只能采用通常进程间通信的方式了。Named pipe! 每当iis接收到一个request,为了给用户响应,它会去定位这个request包含的内容,如果目标是一个后缀为aspx的文件,那么它就意识到这是个asp.net page,不能直接传递给用户,那怎么办?当然就得想办法把request传递给asp.net去让asp.net去处理了,这个“办法”就是调用一个负责和asp.net通信的库aspnet_isapi.dll,将来自浏览器的请求以一种asp.net能接受的方式转发给asp.net 的worker process.
    好了,现在可以开始做一些真正有意思的事情了。Worker process 会把request定向到一个appdomain ,也就是几个有管理的线程组成的虚拟的处理程序,这要感谢.net的runtime-check了,因为有了它,才使得内存问题成为历史,才使得appdomain这种概念成为可能。appdomain1(特指一个开始处理request的asp.net appdomain),会垂直的产生一系列的对象。这里有一个非常形象地名字http pipeline ,因为request会从上到下的在这些对象之间逐级传递,每个对象进行一些处理(看下图)。
From <<Essential ASP.NET with Examples in C#>> write by Fritz
 
上图标为(1)的httpWorkerRequest,是利用request构造一个appdomain时,生成的包含了request中的信息,接下来发生的故事,还是用msdn 上的材料来叙述吧。
"The HttpRuntime class sits at the beginning of the pipeline and is responsible for starting the process. The pipeline begins executing when the static ProcessRequest method is called on the HttpRuntime class. ProcessRequest takes an HttpWorkerRequest object, which contains all the information in the current request. HttpRuntime uses the information in the HttpWorkerRequest to populate the HttpContext object. It then instantiates the appropriate HttpApplication class, which will invoke any IHttpModule implementations registered with the application for pre/post-processing. At this point, the appropriate IHttpHandler implementation is identified, instantiated, and invoked."
from<http://msdn.microsoft.com/msdnmag/issues/04/12/ServiceStation/>
 
我们写的 page 就是一个 IHttpHandler implementation HttpApplication 通过 IHttpHandlerFactory GetHandler接口构造一个Page-derived class 对象,也就是调用 asp.net 为我们页面生成的构造函数。接着立即调用ProcessRequest( class page 继承一个叫做 IHttpHander interface )。我们可以用 vs Object Browser 了解所涉及到的各个类的接口,进一步了解它们的功能。
2.2一个asp.net页面的诞生
我们写asp.net page通常是向一个web form 添加控件,Web form在运行时会被编译成一个类,而这些控件就是这个类的fields (当然这里的控件是指服务器端运行的控件,客户端运行的控件,会成为构造函数的一部分)。非常好的面向对象模型,所有的控件都是逻辑上独立的实体,负责和他们有关的事件处理。当ProcessRequest接口被调用后,我们的类就开始处理一系列的event,与winform不同的是这些event是time sense的,具有严格的顺序(见下图)。
 
 
其实page-derived class和通常的控件,没有什么区别,都是system.web.ui.control-derived.
待续 : )
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值