最近有时间看一些.net的框架代码,发现一个有意思的问题,就是HttpModule中的Init函数下的事件绑定,因为事件
的绑定在事件发生后相应的处理委托即为null,但下面的代码(功能:地址的重定向)为什么只是绑定一次后就能在每个
WEB请求过来时都能运行
ReUrl_BeginRequest事件呢。

public class HttpModule : System.Web.IHttpModule
{
     public void Init(HttpApplication context)
     {
  context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
        ....
     }

     private void ReUrl_BeginRequest(object sender, EventArgs e)
     {
         ....
     }


         原因主要是出现System.Web.HttpApplication 中的这个函数HookupEventHandlersForAppplicationAndModules这个函
数(如下)

Ihttpmodule 的一个小问题,今天明白了
Ihttpmodule 的一个小问题,今天明白了
private void HookupEventHandlersForAppplicationAndModules(MethodInfo[] handlers)

         请注意_moduleCollection这个属性,它其实可以理解为一系列的HttpModule的集合,里面的数据主要是我们在web.config
中的内容,如下:
         <httpModules>
         <add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
          </httpModules>
          上面的代码基本上是找出相关的HTTPMODULE或HANDLER中的绑定事件,然后去运行。
 
          那是什么函数实现了将web.config中的设置获取到_moduleCollection变量中呢,InitModules()这个函数不名思议就是干
这个活的,它的代码如下

Ihttpmodule 的一个小问题,今天明白了private void InitModules()

           另外它还运行了Init方法,而这个方法所干的活就是我们在实现IHTTPMODULE中所希望的操作即:
           {
             context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
              .....
          }

         这样当外部请求来时,系统会运行到System.Web.HttpApplication.InitInternal函数,它会去调用
HookupEventHandlersForAppplicationAndModules,
这样就能在只绑定一次事件之后,即使有新的请求到来是时,系统依然知道要去运行那些要处理的事件。

         这篇文章没有什么技术含量,因为很长时间没写东西了,所以发了出来, 希望大家见谅,献丑了。
 
   
    参考文章:http://www.cnblogs.com/dudu/archive/2006/01/14/317016.html

相关文章: