我们来做进一步的探索,HttpApplication实例需要一个Handler对象来处理资源请求, HttpApplication的主要任务就是找到真正处理请求的类。HttpApplication首先确定了一个创建Handler对象的工厂,来看一下在Machine.config文件中的配置区<httphandlers>,在配置文件注册了应用程序的具体处理类。例如在Machine.config中对*.aspx的处理将映射到System.Web.UI.PageHandlerFactory 类,而对*.ashx的处理将映射到System.Web.UI.SimpleHandlerFactory 类,这两个类都是继承于IhttpHandlerFactory接口的具体类:
运行Internet服务管理器,右键点击默认Web站点,选择属性,移动到主目录选项页,并点击配置按钮。应用程序配置对话框弹出来了。点击添加按钮并在可执行字段输入aspnet_isapi.dll文件路径,在扩展字段输入.sample。其它字段不用处理;该对话框如下所示:
<httpHandlers> <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory" /> <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory" /> </httpHandlers>这个配置区建立了资源请求的类型和处理请求的类之间的一个映射集。如果一个.aspx页面发出了请求,将会调用System.Web.UI.PageHandlerFactory类,HttpApplication调用接口IHttpHandlerFactory中的工厂方法GetHandler来创建一个Handler对象。当一个名为sample.aspx的页面发出请求时,通过PageHandlerFactory将返回一个ASP.SamplePage_aspx对象(具体产品),如下图:
IHttpHandlerFactory工厂:
1public interface IHttpHandlerFactory 2{ 3 // Methods 4 IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated); 5 void ReleaseHandler(IHttpHandler handler); 6} 7
IHttpHandlerFactory.GetHandler是一个工厂方法模式的典型例子,在这个应用中,各个角色的设置如下:
抽象工厂角色:IHttpHandlerFactory
具体工厂角色:PageHandlerFactory
抽象产品角色:IHttpHandler
具体产品角色:ASP.SamplePage_aspx
进一步去理解
理解上面所说的之后,我们就可以去自定义工厂类来对特定的资源类型进行处理。第一步我们需要创建两个类去分别实现IHttpHandlerFactory 和IHttpHandler这两个接口。
1public class HttpHandlerFactoryImpl:IHttpHandlerFactory { 2 3 IHttpHandler IHttpHandlerFactory.GetHandler( 4 HttpContext context, String requestType, 5 String url, String pathTranslated ) { 6 7 return new HttpHandlerImpl(); 8 9 }//IHttpHandlerFactory.GetHandler 10 11 void IHttpHandlerFactory.ReleaseHandler( 12 IHttpHandler handler) { /**//*no-op*/ } 13 14}//HttpHandlerFactoryImpl 15 16public class HttpHandlerImpl:IHttpHandler { 17 18 void IHttpHandler.ProcessRequest(HttpContext context) { 19 20 context.Response.Write("sample handler invoked"); 21 22 }//ProcessRequest 23 24 bool IHttpHandler.IsReusable { get { return false; } } 25 26}//HttpHandlerImpl 27第二步需要在配置文件中建立资源请求类型和处理程序之间的映射。我们希望当请求的类型为*.sample时进入我们自定义的处理程序,如下:
<httpHandlers> <add verb="*" path="*.sample" type="HttpHandlerFactoryImpl,SampleHandler" /> </httpHandlers>最后一步我们需要把文件扩展*.sample映射到ASP.NET ISAPI扩展DLL(aspnet_isapi.dll)上。由于我们已经建立了用于处理新扩展文件的处理程序了,我们还需要把这个扩展名告诉IIS并把它映射到ASP.NET。如果你不执行这个步骤而试图访问*.sample文件,IIS将简单地返回该文件而不是把它传递给ASP.NET运行时。其结果是该HTTP处理程序不会被调用。
运行Internet服务管理器,右键点击默认Web站点,选择属性,移动到主目录选项页,并点击配置按钮。应用程序配置对话框弹出来了。点击添加按钮并在可执行字段输入aspnet_isapi.dll文件路径,在扩展字段输入.sample。其它字段不用处理;该对话框如下所示:
大功告成。