用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
21aspnet的公告
<img src=" http://p.blog.csdn.net/images/p_blog_csdn_net/21aspnet/MVP1.jpg"/>
文章分类
.NET 工具
C# to VB.NET Translator
Fiddler
FxCop代码标准检测工具
httpwatch
ieinspector
IETester
Memcached
Multiple IE
Nbear
Nunit单元测试
pushlets
Tab集合
VB.NET and C# Comparison
VB.NET 代码转为C#
网站国际排名查询工具
.NET 下载/讲座视频
chinaitlab
enfull
Visual Studio 2005 的工具
wrox出版社书刊代码下载
中国台湾微软MSDN
中文MSDN WebCast网络广播全部下载列表
源码之家
.NET 优秀Blog
cathsfz
cnkiminzhuhu
cuike519的专栏
dahuzizyd的专栏
DotNet技术交流乐园
DotNet男孩社区
dudu
gztoby
IT Crazy
Kemin's booootLog
kimyoo(RSS)
Leoo2sk
LoveCherry
MSDN每日追踪
Nios.Org
phphot
Teddy's Knowledge Base
Think Different and Think More
Visual Studio.net专栏
WCF Tools 中国研发团队的专栏
体验ASP.NET 2.0新特性
刘洪峰
天轰穿
孟宪会
宝玉
开心就好【博客堂】
张子阳
彭斌
思归呓语
木子 [I am praying]
李会军
李洪根【VB】
永春阁
汉飞扬【Vista】
涂曙光【SharePoint】
理想&美人(RSS)
维生素C.net
网际浪子
葛涵涛
蒋涛
蝈蝈俊.net[csdn版]
蝈蝈俊.net[joycode版]
谭振林
邹建
阿不
阿良.NET
雨痕
風語·深蓝
鸟食轩(RSS)
黄昕
.NET 优秀网站
.NET 官方网www.asp.net
.NET 藏经阁 - 知识分享
.NET开发资源精华收【不得不看】
ASP .NET FAQ
asp101
aspfree
C#开源资源
C#开源资源大全
C#语言在线帮助网站
codeproject
infragistics
Internet Explorer 开发者资源
iwebsms
MSDN Web/服务
MSDN中文
Scott Guthrie(ASP.NET之父)
SharePoint爱好者
VS2005.com
Wintellect
www.411asp.net
世界上最大的Open Source项目在线网站
中国C#技术学习中心
官方ASP.NET入门教程
微软中文新闻组
微软官方.NET指导站点
最好的索引网站
正则
邮件发送常见问题解决方法
Ajax链接
AJAX载入等待图片在线生成
bindows(RSS)
DHTML menu4作者主页(RSS)
Dhtmlgoodies
Dynamicdrive
EXT类库
json
Tabs
Tabs
Tabs
Yahoo YUI
大量DHTML代码
无忧脚本 - JavaScript
索漫
综合开发技术网
CSDN
IBM中文Web 项目资源中心
W3C技术在中国
中国BS网
中文C#技术站
天新网
天极网开发频道
太平洋电脑网web开发
看雪
统一教学网
编程爱好者
网页设计师:web标准教程及推广,网站重构
老猫理想
蓝色理想
豆豆技术网
赛迪网
存档

原创  ASP.NET的(HttpModule,HttpHandler) 收藏

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,
-------------------------------------


ASP.NET的HTTP请求处理方法
当客户端向web服务器请求一个*.aspx的页面文件时,同asp类似,这个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这个容器中做到这个的。
----------------------------------------
-------------------------------------
系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的HttpModule对象了。
ASP.NET系统中默认的HttpModule:

DefaultAuthenticationModule 确保上下文中存在 Authentication 对象。无法继承此类。
FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装。无法继承此类。
SessionStateModule   为应用程序提供会话状态服务。
UrlAuthorizationModule   提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
WindowsAuthenticationModule 启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类

--------------------------------------
这些系统默认的HttpModule是在文件machine.config中配置的,和我们开发时使用到的web.config的关系是:是在ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己的HttpModule,你仍然可以在所在页面的web.config文件中remove掉这个映射关系。
public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }

    // In the Init function, register for HttpApplication
    // events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest +=
            (new EventHandler(this.Application_BeginRequest));
        application.EndRequest +=
            (new EventHandler(this.Application_EndRequest));
    }

    private void Application_BeginRequest(Object source,
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
    }

    private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
    }

    public void Dispose()
    {
    }
}

    <system.web>
<httpModules>
   <add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
    </system.web>
-----------------------------------------------------------------------------------
深入HttpModule
一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等。
-----------------------------------------------------------------
IHttpHandler
它是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI.PageHandlerFactory的HttpHandler类来处理。
HH和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其 内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

发表于 @ 2009年02月02日 11:00:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:做人做项目 | 新一篇:Asp.Net下通过切换CSS换皮肤

  • 发表评论
  • 评论内容:
  •  
Copyright © 21aspnet
Powered by CSDN Blog