你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
从.Net类库代码来看Asp.net运行时(6)
 
这里为什么要看似多此一举把对事件的触发再做一层封装,封装为所谓“执行步骤”,在后文介绍。
(4)用一个数组来保存所有的执行步骤。可以想象,真正到执行的时候,从数组里取出每一项IExecutionStep,再执行其Execute()方法即可。而Execute里面,肯定是对事件委托链的调用无疑
private IExecutionStep[] _execSteps;
(5)HttpModule在它初始化的时候完成对事件的注册。在创建HttpApplication对象的时候,会调用这个对象的InitInternal方法,这个方法内部会调用InitModules() ,它用来初始化和这个应用有关的所有HttpModule,而在这个方法里面,最重要的就是调用了每个Module的Init()方法。那么,如果我们有一个自定义的HttpModule,并希望这个Module去响应BeginRequest事件,我们应该这样定义自己的Module的Init()方法:
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(this.YourCustomMethodForBeginRequestEvent);
}

  这样就完成了注册。当然,此时事件还没有执行,你也还没有看到事件和执行步骤的关系,HttpHandler也尚未登场。

  (6)前面提到过所谓“执行步骤”,让我们先来看两个在HttpApplication中被定义的IExecutionStep,因为这两个执行步骤中所完成的,一个是对HttpHandler的解析和实例化,一个是调用HttpHandler的ProcessRequest方法,他们分别是MapHandlerExecutionStep和CallHandlerExecutionStep。读者可以自己去读一下这两个类的Execute()方法的代码,当您第一次从CallHandlerExecutionStep.Execute()中看到handler.ProcessRequest(context)和handler2.BeginProcessRequest(context, this._completionCallback, null)这样的调用语句,从MapHandlerExecutionStep.Execute()中看到context.Handler = this._application.MapHttpHandler(context, request.RequestType, request.FilePathObject, request.PhysicalPathInternal, false); 这样的调用语句,一定会有一种“哎呀,原来你们在这里”的快感,呵呵。

  (7)对“执行步骤数组”的初始化操作,就放在HttpApplication.InitInternal()方法里,具体就是下面这段语句:
(编辑:aniston)
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089