阅读文章

初窥asp.net Runtime

[日期:2008-03-04] 来源:  作者: [字体: ]

    
  动手写这个系列之前,我犹豫不决,因为类似的文章在博客圆中,已经不少了,感觉有点不好意思:)园中,有位朋友说过这样一句话,“我们不要重复发明轮子,而要扩展轮子”,那我就当自己是在“扩展轮子“,给自己找个由头吧!
  
  在我的博客中,第一篇写的就是ASP.net运行时流程,园子里的朋友给了很多的宝贵意见,在此谢过了。也有朋友说,太抽象了,不够细。所以我在工作之余,抽出时间写下这点东西!
  
  还是先贴一张图,所谓一图胜万言,使大家对运行时,有一个全局的把握。
  
  图很明了,三个椭圆,不,应该是四个,第一个是ASP.net的运行环境,当请求到达www服务inetinfo.exe后,经过ASPnet_isapi.dll筛选之后,请求这才真正进入ASPnet_wp.exe进程,也就是httpRuntime,之后系统会加载一系列的HttpModule,那么我们就来看看系统到底加载了哪些模块。先定位到“C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"CONFIG“,怪了,这个目录很是熟悉,是的,这是.net系统配置文件machine.config所在的目录。不过我今天要找的不是他,而是web.config,这是.net专门给web独立定义connfig文件,没错,web.cofig也在此目录中。
  
   打开web.config文件后,大家可能很郁闷,这么多的数据,怎么看呢!大家别急,都知道web.config文件是合法的XML文件,那我们就把扩展名config改成XML得了,再用IE打开,数据就一目了然了!
  
  
  
  很明显,Congfiguration根,包括注释一起,才四个主元素,我们打开system.web节点,
  
  
  也很明显,可以看到系统对“输出缓存”,“会话”,“验证和授权”等模块都一一进行配置加载。记得有朋友问,为什么在自定义的httpModule中,使用Session[“key”]的时候都会抛出null对象异常呢?我告诉大家,那是因为Session在此时,还没有生成,所以在自定义的httpModule中使用Session,那都是瞎忙活!
  
   有人可能会问,说了这么多,自定义的HttpModule到底有什么用呢?先别急,我们先来看看系统的IHttpModule接口的真面目!
  
  [ASPNetHostingPermission(SecurityAction.InheritanceDemand, Level=ASPNetHostingPermissionLevel.Minimal),
  ASPNetHostingPermission(SecurityAction.LinkDemand, Level=ASPNetHostingPermissionLevel.Minimal)]
  public interface IHttpModule
  {
  // Methods
  void Dispose();
  void Init(HttpApplication context);
  }很明显,从字面意思,就可以看出这两个方法的作用, Init()用来初始化一个module,传递一个HttApplication对象作为参数,为以后捕获处理请求做一些准备,Dispose()用来销毁不再被module所使用的资源!注意,运行时的大部分方法都是调用HttApplication对象的方法,严格说,应该是向HttApplication对象订阅。
  
  下面我们就动手来写一个自己的HttpModule!
  
  第一步,新建一类库!
  
  class MyHttpModuleClass:System.Web.IHttpModule//实现IHttpModule接口
  {
   public MyHttpModuleClass()
   { }
   public void Init(HttpApplication application)//实现Init方法
   {
   application.BeginRequest+=new EventHandler(this.application_BeginRequest);
   application.EndRequest+=new EventHandler(this.application_EndResponse);
   }
   private void application_BeginRequest(Object obj, EventArgs e)
   {
  
   HttpApplication application = (HttpApplication)obj;
  
   HttpContext context = application.Context;
  
   HttpRequest request = context.Request;
  
   HttpResponse response = context.Response;
  
   response.Write("hi ,i am from application_BeginRequest"+"</br>");
  
   }
  
   private void application_EndResponse(Object obj, EventArgs e)
   {
   HttpApplication application = (HttpApplication)obj;
  
   HttpContext context = application.Context;
  
   HttpRequest request = context.Request;
  
   HttpResponse response = context.Response;
  
   response.Write("hi ,i am from application_EndResponse");
  
   }
  
   public void Dispose()//实现Dispose方法,但什么也不做
   { }
  }
  
  第二步
  
  新建一website,在她的web.config中,加上httpModules节点!
  
  <httpModules>
  
  <add name="wmjHttpModule" type="MyHttpModule.MyHttpModuleClass"/>
  
  </httpModules>
  
  注意wmjHttpModule为别名,可以随便起,MyHttpModule为程序集名称,MyHttpModuleClass为自定义的IHttpModule类名!
  
  第三步
  
  编译类库,然后把dll拷贝到GAC,或者website的bin目录下面,如果是直接放bin目录下,那么配置文件就没必要加上程序集的名称了
  
  <httpModules>
  
  <add name="wmjHttpModule" type="MyHttpModuleClass"/>
  
  </httpModules>
  
  第四步
  
  按F5,您是不是看到这两句话了呢?
  
  hi ,i am from application_BeginRequest
  
  hi ,i am from application_EndRequest
  
  最后,祝大家好运!
  
  (后续未完)
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:Minesweeper: GDI+ 综述
下一篇:IE7的web标准之道——4:(修正)歌剧院魅影bug
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款