问题1:什么是HttpHandler?
问题2:什么是HttpModule?
问题3:什么时候应该使用HttpHandler什么时候使用HttpModule?
答案1:HttpHandler,Http请求的处理者,例如ScriptHandler、WebServiceHandler,IHttpHandler的实现都是为了处理某一类具体资源的请求。
答案2:HttpModule,Http模块。实际上就是那19个标准事件的处理者,比如OutputCacheModule,SessionStateModule。
一、HttpHandler
应该还记得我们提到过 ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?为了搞清楚这个问题,我们需要打开机器上C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG 目录下的web.config 文件。
1
2
3
4
5
6
7
8
9
10
11
|
<httpHandlers> ... ... //略 <add path= "*.axd" verb= "*" type= "System.Web.HttpNotFoundHandler" validate= "True" /><add path= "*.aspx" verb= "*" type= "System.Web.UI.PageHandlerFactory" validate= "True" /> <add path= "*.ashx" verb= "*" type= "System.Web.UI.SimpleHandlerFactory" validate= "True" /> <add path= "*.asax" verb= "*" type= "System.Web.HttpForbiddenHandler" validate= "True" /> <add path= "*.ascx" verb= "*" type= "System.Web.HttpForbiddenHandler" validate= "True" /> <add path= "*.config" verb= "*" type= "System.Web.HttpForbiddenHandler" validate= "True" /> <add path= "*.cs" verb= "*" type= "System.Web.HttpForbiddenHandler" validate= "True" /> <add path= "*" verb= "GET,HEAD,POST" type= "System.Web.DefaultHttpHandler" validate= "True" /> ... ... //略 </httpHandlers><br><br><add path= "*.jpg" verb= "*" type= "MyNameSpace.MyClass, MyDllName" /><br>path指的是请求的文件名称,可以使用通配符扩大范围,也可以明确指定这个handler仅用于处理某个特定的文件(比如说:filename.aspx)的请求。verb指的是请求此文件的方式,可以是post或 get ,用*代表所有访问方式。type属性由“,”分隔成两部分,第一部分是实现了接口的类名,第二部分是位于Bin目录下的编译过的程序集名称 |
可以看到,在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理。所以,我们应该这样理解HttpHanlder:一个HttpHanlder用于响应一类资源的请求,为一类的请求生成响应结果。
我们经常用到的HttpHanlder有哪些?
1. aspx页面。
2. asmx服务文件。
3. ashx文件(一般处理程序)。
4. 实现IHttpHandler接口的自定义类型。
我们通常使用HttpHanlder做什么?
HttpHanlder类型 | 实现目标 |
aspx页面 | 响应aspx的请求,输出HTML结果 |
asmx服务文件 | 响应服务调用 |
ashx文件(一般处理程序) | 实现简单的AJAX响应 |
实现IHttpHandler接口的自定义类 | 响应相应扩展名的请求 |
二、HttpModule
一般来说,我们可以将Asp.Net中的事件分成三个级别, 应用程序级事件、其次是页面级事件、最下面是控件级事件,事件的触发分别与 应用程序周期、页面周期、控件周期紧密相关。而 HttpModule 的作用是与应用程序事件密切相关的。我们通过Http Module在Http请求管道(Pipeline)中注册期望对应用程序事件做出反应的方法,在相应的事件触发的时候便会调用Http Module注册了的方法。.Net 本身已经有很多的Http Module。与 Http Handler类似,我们需要打开机器上C:WINDOWSMicrosoft.NETFramework v2.0.50727CONFIG 目录下的 web.config 文件。找到 <httpModules/> 结点,应该可以看到下面的内容
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
<add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
... 略
</httpModules>
type属性与所说的http handler结点的type属性类似都代表了相应的程序集,但与http handler 不同,module只提供了一个name属性,没有诸如 path这样指定某一特定(或者用通配符 * 代表某一种类)文件的处理程序。这是与Module的特点相关的,我们知道 module 是响应应用程序周期中触发的事件,对于所有提交到aspnet_isapi.dll的请求都一样
举例:
<system.web>
<httpModules>
<add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>
</httpModules>
</system.web>
可通过应用程序(HttpApplication)的Modules属性获取HttpModuleCollection集合,然后通过name属性,进一步获取HttpModule对象。
通过name属性还可在global.asax中文件中编写自定义HttpModule暴露出的事件的处理程序采用的格式是:void ModuleName_EventName(object sender, EventArgs e)
下面这张表格列出了C:WINDOWSMicrosoft.NETFramework v2.0.50727CONFIG下的Web.Config中的 Asp.Net 内置的Http Modules 及其主要作用。
名称 | 类型 | 功能 |
OutputCache | System.Web.Caching.OutputCacheModule | 页面级输出缓存 |
Session | System.Web.SessionState.SessionStateModule | Session状态管理 |
WindowsAuthentication | System.Web.Security.WindowsAuthenticationModule | 用集成Windows身份验证进行客户端验证 |
FormsAuthentication | System.Web.Security.FormsAuthenticationModule | 用基于Cookie的窗体身份验证进行客户端身份验证 |
PassportAuthentication | System.Web.Security.PassportAuthenticationModule | 用MS护照进行客户身份验证 |
RoleManager | System.Web.Security.RoleManagerModule | 管理当前用户角色 |
UrlAuthorization | System.Web.Security.UrlAuthorizationModule | 判断用户是否被授权访问某一URL |
FileAuthorization | System.Web.Security.FileAuthorizationModule | 判断用户是否被授权访问某一资源 |
AnonymousIdentification | System.Web.Security.AnonymousIdentificationModule | 管理Asp.Net应用程序中的匿名访问 |
Profile | System.Web.Profile.ProfileModule | 管理用户档案文件的创立 及相关事件 |
ErrorHandlerModule | System.Web.Mobile.ErrorHandlerModule | 捕捉异常,格式化错误提示字符,传递给客户端程序 |
我们用HttpModule做什么事情?
1. 修改某些请求(例如前面的示例修改了响应头)。
2. 检查请求(例如身份认证检查)。
HttpModule能处理哪些请求呢?
1. 默认是全部进入ASP.NET的请求。
2. 如果只需要处理部分请求,那么请自行判断。
三、总结
HttpHandler相当于一条水管,HttpModule相当于一小节水管。需要过滤的长水管里面都可以装上。
HttpHandler练习参照:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html
HttpModule练习参照 http://www.cnblogs.com/JimmyZhang/archive/2007/11/25/971878.html