选择显示字体大小

asp.net framework深度历险(2)

     刚刚吃完晚饭,正好在键盘上面锻炼一下手指。
  接着上回继续写这个“日记”:
  
  chapter two -- httpmodule是如何工作的?
  
  我们上回说到,一个来自于客户端的http request被截获后经过层层转交(怎么都在踢皮球?呵呵)到达了httpmodule这个“请求监听器”。
  httpmodule就类似于安插在as.net_wp.exe进程中的一个窃听器,稍微有些常识的人都会很自然的想象得到窃听器是用来做什么的,而我们的httpmodule
  可以说是作窃听器的绝好人选了,但是需要明确的是,httpmodule绝对不是简单的监听器,它可以做到更多的东西,比如它可以对截获的请求增加一些内容
  等等。
  另外需要明白的是,当一个http request到达httpmodule的时候,整个asp.net framework系统还并没有对这个请求做任何的真正处理,但是我们可以
  在这个http request传递到真正的请求处理中心(httphandler)之前附加一些我们需要的信息在这个http request至上,或者针对我们截获的这个http
  request信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的http request,从而可以起到一个filter过滤器的作用,而不仅仅是一个窃听器了。
  通过查阅msdn(不要去相信.net sdk自带的那个quickstarts web文档,正式版本中竟然在很多地方没有更新这个文档,很多东西在正式版本是无效的),
  你会发现系统httpmodule实现了一个叫做ihttpmodule的接口,很自然的就应当想到,只要我们自己的类能够实现ihttpmodule接口,不就可以完全替代系统的
  httpmodule了吗?完全正确。
  在我们开始自己的httpmodule类之前,我先来告诉你系统中的那个httpmodule是什么样子的,asp.net系统中默认的httpmodule有以下几个:
  system.web.caching.outputcachemodule
  system.web.sessionstate.sessionstatemodule
  system.web.security.windowsauthenticationmodule
  system.web.security.formsauthenticationmodule
  system.web.security.passportauthenticationmodule
  system.web.security.urlauthorizationmodule
  system.web.security.fileauthorizationmodule
  
  好了,我们来开始我们自己的httpmodule构建历程吧。
  1)打开vs.net新建一个“class library”项目,将它命名为myhttpmodule。
  2)引用system.web.dll文件
  
  在代码区域敲入:
  
  using system;
  using system.web;
  
  namespace myhttpmoduletest
  {
  /// <summary>
  /// 说明:用来实现自定义httpmodule的类
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  public class myhttpmodule:ihttpmodule
  {
  /// <summary>
  /// 说明:构造器方法
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  public myhttpmodule()
  {
  
  }
  
  /// <summary>
  /// 说明:实现ihttpmodule接口的init方法
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  /// <param name="application">httpapplication类型的参数</param>
  public void init(httpapplication application)
  {
  application.beginrequest +=new eventhandler(this.application_beginrequest);
  application.endrequest +=new eventhandler(this.application_endrequest);
  }
  
  /// <summary>
  /// 说明:自己定义的用来做点事情的私有方法
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  /// <param name="obj">传递进来的对象参数</param>
  /// <param name="e">事件参数</param>
  private void application_beginrequest(object obj,eventargs e)
  {
  httpapplication application=(httpapplication)obj;
  httpcontext context=application.context;
  httpresponse response=context.response;
  httprequest request=context.request;
  
  response.write("我来自application_beginrequest,:)");
  
  }
  
  /// <summary>
  /// 说明:自己定义的用来做点事情的私有方法
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  /// <param name="obj">传递进来的对象参数</param>
  /// <param name="e">事件参数</param>
  private void application_endrequest(object obj,eventargs e)
  {
  httpapplication application=(httpapplication)obj;
  httpcontext context=application.context;
  httpresponse response=context.response;
  httprequest request=context.request;
  
  response.write("我来自application_endrequest,:)");
  
  }
  
  /// <summary>
  /// 说明:实现ihttpmodule接口的dispose方法
  /// 作者:uestc95
  /// 联系:uestc95@263.net
  /// </summary>
  public void dispose(){}
  }
  }
  
  3)在vs.net中编译之后,你会得到myhttpmodule.dll这个文件。
  4)接下来我们的工作就是如何让as.net_wp.exe进程将http request交给我们自己写的这个httpmodule呢?方法就是配置web.config文件。
  在web.config文件中增加如下几句话:
  <httpmodules>
  <add name="test" type="myhttpmoduletest.myhttpmodule,myhttpmodule"/>
  </httpmodules>
  注意要区分大小写,因为web.config作为一个xml文件是大小写敏感的。“type=myhttpmoduletest.myhttpmodule,myhttpmodule”告诉我们
  系统将会将http request请求交给位于myhttpmodule.dll文件中的myhttpmoduletest.myhttpmodule类去处理。而这个dll文件系统将会自动
  到\bin子目录或者系统全局程序集缓冲区(gac)搜寻。我们可以将我们刚才得到的dll文件放在bin子目录中,至于后者,你可以通过.net sdk正式版
  自带的config工具做到,我们不详细说了。
  
  
  好了,我们的用来截获http request请求的httpmodule就完成并且装配完成了,你可以试着在你的web项目中建立一个新的webform,运行看看呢?:)
  最后,我们假设一个使用这个httpmodule的场合。a站点提供免费的asp.net虚拟空间给大家,但是a站点的管理者并不想提供免费的午餐,他想要在每一个
  页面被浏览的时候自动弹出自己公司的广告(就像现在的www.x63.com一样),我总不能时刻监视所有用户的所有页面吧,并且想要在每一个页面手动添加
  一段js代码,工作量是不可想象的,也是不现实的。那末好了,只要我们的httpmodule一旦被挂接完成,这一切都将是轻而易举的事情了,只要我们在每一个
  http request被我们捕获的时候,给他增加上一些js就好了!
  
  我们上面提到在init()方法中使用了两个事件beginrequest和endrequest,这两个事件分别是init()中可以处理的所有事件的最开始事件和最终事件,在他们
  中间还有一些其它的事件可以被我们利用,可以查阅msdn。
  
  另外在我关闭editplus之前,需要敲下如下的话:
  在httpmodule中可以正常使用response,request,server,application,但是不能操作任何与session有关代码!
  为什么呢?自己考虑一下吧,下回看看原因在哪里,另外再给出一个问题,你能发现系统默认的那几个httpmodule在哪里配置的呢?找找看。
  
  下回我们看看httphandler部分以及如何同httpmodule相配合的东东。
  
  see you later.
  
  
  
    


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons