httpModule HttpHandler

本文详细解析了ASP.NET中HTTP请求的处理流程,从客户端请求*.aspx页面开始,到请求被inetinfo.exe捕获并转交给ASPNET_ISAPI.DLL,再到ASPNET_WP.EXE进程中的HttpRuntime处理请求,最后返回结果给客户端。文中还对比了IHttpModule与IHttpHandler的区别,并提供了HttpModule和HttpHandler的实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ASP.NET的HTTP请求处理方法
当客户端向web服务器请求一个*.aspx的页面文件时,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
------------------------------------
当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。

IHttpModule与IHttpHandler的区别整理
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:
   IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
   IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

HttpModule

一个HttpModule的例子如下:

 1 namespace  MyModule
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3 public class MyHttpModule : IHttpModule
 4ExpandedSubBlockStart.gifContractedSubBlock.gif {
 5    public MyHttpModule()
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 7    }

 8  
 9    //Init方法用来注册HttpApplication 事件。
10     public void Init(HttpApplication r_objApplication)
11ExpandedSubBlockStart.gifContractedSubBlock.gif    {
12      r_objApplication.BeginRequest += new EventHandler(this.BeginRequest);
13    }
    
14
15    public void Dispose()
16ExpandedSubBlockStart.gifContractedSubBlock.gif    {
17    }
    
18
19    private void BeginRequest(object r_objSender, EventArgs r_objEventArgs)
20ExpandedSubBlockStart.gifContractedSubBlock.gif    {
21      HttpApplication objApp = (HttpApplication)r_objSender;
22      objApp.Response.Write("您请求的URL为" + objApp.Request.Path);
23    }

24 }

25}

26

HttpModule主要功能是对Application的各个事件进行截取,在这些事件中完成自己的处理。其实如果自己开发一些项目,直接在 Global.asax中处理已经足够了。如果是开发一个Framework或者是某些方面的组件,需要在事件中添加处理,开发自定义的 HttpModule,可以避免使用Framework或者组件时,还得手工在Global.asax中添加代码。     目前想到的开发自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等。当然,如果是结合自定义的HttpHandler进行Framework的开发,HttpModule可以用于其它的一些特殊的处理。 
      <httpModules>
         <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>
       </httpModules>

注,对配置的解释:<add   name="随便命名"   type="HttpModule命名空间加类名,dll文件名"   />
   注意要区分大小写,因为web.config作为一个XML文件是大小写敏感的。“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”告诉我们系统将会将http request请求交给位于MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。

HttpHandler:

HttpHandler是完全的对Http Request的截取。
    首先,继承System.Web.IHttpHandler接口,实现自己的HttpHandler类。必须要实现接口的ProcessRequest方 法和IsReusable属性。ProcessRequest方法中完成对每个Http Request的处理,发送处理结果的HTML到输出缓存中。IsReusable属性被.Net Framework调用,用以确定这个HttpHandler的实例是否可以被重用于同类型其它的Request处理。
    如果你在自己的HttpHandler类中,需要读取或者是写Session值,需要再继承一个接口IRequiresSessionState。这个接 口没有任何方法,只是一个标记接口。继承这个接口之后,就可以在自己的HttpHandler中访问Session,可以在Session中写入值。
httpHandler Url重写的实现:

 

 1 public   void  ProcessRequest(HttpContext Context)
 2 ExpandedBlockStart.gifContractedBlock.gif {    
 3try 
 4ExpandedSubBlockStart.gifContractedSubBlock.gif{        
 5    //申明Request         
 6    HttpRequest Request = Context.Request; 
 7    //取来路Url的绝对路径        
 8    string Url = Request.Url.AbsolutePath; 
 9    //取访问的Web文件的开始字符间隔数
10    int RegStart = Url.LastIndexOf("/"+ 1
11    //申明一个确定Web文件名是否全是数字
12    Regex Reg = new Regex(@"\d+"); 
13    //用正则表达式进行匹配 
14    if (Reg.IsMatch(Url, RegStart)) 
15ExpandedSubBlockStart.gifContractedSubBlock.gif    
16    //如果web文件名是数字,则判定是查询相关文章,执行指定页面 
17    Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);        
18}
    
19}

20catch
21ExpandedSubBlockStart.gifContractedSubBlock.gif{
22     Context.Response.Redirect(Context.Request.Url.ToString()); 
23}

24}

当然你首先要做的是先建一个类,并继承自IHttpHandler,然后把这段代码拷入,并编译。在Web项目中若要使用此功能,需要在web.config里面加上如下语句:
<httpHandlers>
    <add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" />
</httpHandlers>
注释:verb属性配置这个HttpHandler处理那些HTTP方法,例如GET、POST等,如果是处理所有方法,就用*。path属性配置HttpHandler对哪些文件进行处理,例如可以是myfile.cc,如果是处理所有的.cc文件,就用*.cc。

同时,还要在IIS中对Web项目进行配置,在Web项目的属性中,在主目录选项卡里,把执行权限改为"脚本和可执行文件",然后打开配置,在应用程序扩展里加上需重写的文件格式的扩展

转载于:https://www.cnblogs.com/luckboy/archive/2009/07/07/1518182.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值