刚刚吃完晚饭,正好在键盘上面锻炼一下手指。
接着上回继续写这个“日记”:
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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器