问题1:什么是HttpHandler?

  问题2:什么是HttpModule?

  问题3:什么时候应该使用HttpHandler什么时候使用HttpModule?

IHttpHandler的实现都是为了处理某一类具体资源的请求。

实际上就是那19个标准事件的处理者,比如OutputCacheModule,SessionStateModule。

一、HttpHandler

  应该还记得我们提到过 ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?为了搞清楚这个问题,我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。

<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目录下的编译过的程序集名称


一个HttpHanlder用于响应一类资源的请求,为一类的请求生成响应结果。

  我们经常用到的HttpHanlder有哪些?

  1. aspx页面。
  2. asmx服务文件。
  3. ashx文件(一般处理程序)。
  4. 实现IHttpHandler接口的自定义类型。

  我们通常使用HttpHanlder做什么?


HttpHanlder类型

实现目标

aspx页面

响应aspx的请求,输出HTML结果

asmx服务文件

响应服务调用

ashx文件(一般处理程序)

响应

实现IHttpHandler接口的自定义类

响应相应扩展名的请求


二、HttpModule

而 HttpModule 的作用是与应用程序事件密切相关的。我们通过Http Module在Http请求管道(Pipeline)中注册期望对应用程序事件做出反应的方法,在相应的事件触发的时候便会调用Http Module注册了的方法。.Net 本身已经有很多的Http Module。与 Http Handler类似,我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727\CONFIG 目录下的 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>

但与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:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727\CONFIG下的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练习参照

   HttpModule练习参照