IHttpHandlerFactory.GetHandler Method
Returns an instance of a class that implements the IHttpHandler interface.
[Visual Basic] Function GetHandler( _ ByVal context As HttpContext, _ ByVal requestType As String, _ ByVal url As String, _ ByVal pathTranslated As String _ ) As IHttpHandler [C#] IHttpHandler GetHandler( HttpContext context, string requestType, string url, string pathTranslated ); [C++] IHttpHandler* GetHandler( HttpContext* context, String* requestType, String* url, String* pathTranslated ); [JScript] function GetHandler( context : HttpContext, requestType : String, url : String, pathTranslated : String ) : IHttpHandler;
Parameters
- context
- An instance of the HttpContext class that provides references to intrinsic server objects (For example, Request, Response, Session, and Server) used to service HTTP requests.
- requestType
- The HTTP data transfer method (GET or POST) that the client uses.
- url
- The RawUrl of the requested resource.
- pathTranslated
- The PhysicalApplicationPath to the requested resource.
Return Value
A new IHttpHandler object that processes the request.
Example
The following example creates custom handler objects in response to a client request for a page named either abc.aspx or xyz.aspx. The handler factory class named hwf creates the appropriate handler object depending on the page requested.
[Visual Basic] ' Name this Visual Basic file HandlerFactoryTest.vb and compile it with ' the command line: vbc /t:Library /r:System.Web.dll HandlerFactoryTest.vb. ' Copy HandlerFactoryTest.dll to your \bin directory. Imports System Imports System.Web Namespace test ' Factory class that creates a handler object based on a request ' for either abc.aspx or xyz.aspx as specified in the Web.config file. Public Class MyFactory Implements IHttpHandlerFactory Public Overridable Function GetHandler(context As HttpContext, _ requestType As String, url As String, pathTranslated As String) _ As IHttpHandler _ Implements IHttpHandlerFactory.GetHandler Dim fname As String = url.Substring(url.LastIndexOf("/"c) + 1) Dim cname As String = fname.Substring(0, fname.IndexOf("."c)) Dim className As String = "test." & cname Dim h As Object = Nothing Try ' to create the handler object. ' Create by calling class abc or class xyz. h = Activator.CreateInstance(Type.GetType(className)) Catch e As Exception Throw New HttpException("Factory couldn't create instance " & _ "of type " & className, e) End Try Return CType(h, IHttpHandler) End Function ' This is a must override method. Public Overridable Sub ReleaseHandler(handler As IHttpHandler) _ Implements IHttpHandlerFactory.ReleaseHandler End Sub End Class ' Class definition for abc.aspx handler. Public Class abc Implements IHttpHandler Public Overridable Sub ProcessRequest(context As HttpContext) _ Implements IHttpHandler.ProcessRequest context.Response.Write("<html><body>") context.Response.Write("<p>ABC Handler</p>" & _ Microsoft.VisualBasic.ControlChars.CrLf) context.Response.Write("</body></html>") End Sub Public Overridable ReadOnly Property IsReusable() As Boolean _ Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class ' Class definition for xyz.aspx handler. Public Class xyz Implements IHttpHandler Public Overridable Sub ProcessRequest(context As HttpContext) _ Implements IHttpHandler.ProcessRequest context.Response.Write("<html><body>") context.Response.Write("<p>XYZ Handler</p>" & _ Microsoft.VisualBasic.ControlChars.CrLf) context.Response.Write("</body></html>") End Sub Public Overridable ReadOnly Property IsReusable() As Boolean _ Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class End Namespace '______________________________________________________________ ' 'To use the handler factory, use the following lines in a 'Web.config file. (be sure to remove the comment markers) ' '<configuration> ' <system.web> ' <httpHandlers> ' <add verb="*" path="abc.aspx" type="test.MyFactory,HandlerFactoryTest" /> ' <add verb="*" path="xyz.aspx" type="test.MyFactory,HandlerFactoryTest" /> ' </httpHandlers> ' </system.web> '</configuration> [C#] // Name this C# file HandlerFactoryTest.cs and compile it with the // command line: csc /t:Library /r:System.Web.dll HandlerFactoryTest.cs. // Copy HandlerFactoryTest.dll to your \bin directory. namespace test { using System; using System.Web; // Factory class that creates a handler object based on a request // for either abc.aspx or xyz.aspx as specified in the Web.config file. public class MyFactory : IHttpHandlerFactory { public virtual IHttpHandler GetHandler(HttpContext context, String requestType, String url, String pathTranslated) { String fname = url.Substring(url.LastIndexOf('/')+1); String cname = fname.Substring(0, fname.IndexOf('.')); String className = "test." + cname; Object h = null; // Try to create the handler object. try { // Create the handler by calling class abc or class xyz. h = Activator.CreateInstance(Type.GetType(className)); } catch(Exception e) { throw new HttpException("Factory couldn't create instance " + "of type " + className, e); } return (IHttpHandler)h; } // This is a must override method. public virtual void ReleaseHandler(IHttpHandler handler) { } } // Class definition for abc.aspx handler. public class abc : IHttpHandler { public virtual void ProcessRequest(HttpContext context) { context.Response.Write("<html><body>"); context.Response.Write("<p>ABC Handler</p>\n"); context.Response.Write("</body></html>"); } public virtual bool IsReusable { get { return true; } } } // Class definition for xyz.aspx handler. public class xyz : IHttpHandler { public virtual void ProcessRequest(HttpContext context) { context.Response.Write("<html><body>"); context.Response.Write("<p>XYZ Handler</p>\n"); context.Response.Write("</body></html>"); } public virtual bool IsReusable { get { return true; } } } } /* ______________________________________________________________ To use the handler factory, use the following lines in a Web.config file. <configuration> <system.web> <httpHandlers> <add verb="*" path="abc.aspx" type="test.MyFactory,HandlerFactoryTest" /> <add verb="*" path="xyz.aspx" type="test.MyFactory,HandlerFactoryTest" /> </httpHandlers> </system.web> </configuration> */ [C++] #using <mscorlib.dll> #using <System.Web.dll> // Name this C++ file HandlerFactoryTest.cs and compile it with the // command line // cl /clr /LD HandlerFactoryTest.cpp // Copy HandlerFactoryTest.dll to your \bin directory. namespace test { using namespace System; using namespace System::Web; // Factory class that creates a handler object based on a request // for either abc.aspx or xyz.aspx as specified in the Web.config file. public __gc class MyFactory : public IHttpHandlerFactory { public: virtual IHttpHandler* GetHandler(HttpContext* /*context*/, String* /*requestType*/, String* url, String* /*pathTranslated*/) { String* fname = url->Substring(url->LastIndexOf('/')+1); String* cname = fname->Substring(0, fname->IndexOf('.')); String* className = String::Format( S"test.{0}", cname ); Object* h = 0; // Try to create the handler object. try { // Create the handler by calling class abc or class xyz. h = Activator::CreateInstance(Type::GetType(className)); } catch(Exception* e) { throw new HttpException(String::Format( S"Factory couldn't create instance of type {0}", className ), e); } return dynamic_cast<IHttpHandler*>(h); } // This is a must override method. virtual void ReleaseHandler(IHttpHandler* /*handler*/) { } }; // Class definition for abc.aspx handler. public __gc class abc : public IHttpHandler { public: virtual void ProcessRequest(HttpContext* context) { context->Response->Write(S"<html><body>"); context->Response->Write(S"<p>ABC Handler</p>\n"); context->Response->Write(S"</body></html>"); } __property virtual bool get_IsReusable() { return true; } }; // Class definition for xyz.aspx handler. public __gc class xyz : public IHttpHandler { public: virtual void ProcessRequest(HttpContext* context) { context->Response->Write(S"<html><body>"); context->Response->Write(S"<p>XYZ Handler</p>\n"); context->Response->Write(S"</body></html>"); } __property virtual bool get_IsReusable() { return true; } }; } /* ______________________________________________________________ To use the handler factory, use the following lines in a Web.config file. <configuration> <system.web> <httpHandlers> <add verb="*" path="abc.aspx" type="test.MyFactory,HandlerFactoryTest" /> <add verb="*" path="xyz.aspx" type="test.MyFactory,HandlerFactoryTest" /> </httpHandlers> </system.web> </configuration> */ [JScript] // Name this JScript file HandlerFactoryTest.js and compile it with // the command line: jsc /t:library /r:System.Web.dll HandlerFactoryTest.js. // Copy HandlerFactoryTest.dll to your bin directory. import System import System.Web package test{ // Factory class that creates a handler object based on request // for either abc.aspx or xyz.aspx : specified in web.config. class MyFactory implements IHttpHandlerFactory{ function IHttpHandlerFactory.GetHandler(context : HttpContext, requestType : String, url : String, pathTranslated : String) : IHttpHandler{ var fname : String = url.Substring(url.LastIndexOf(Char("/")) + 1) var cname : String = fname.Substring(0, fname.IndexOf(Char("."))) var className : String = "test." + cname var h : Object = null try{// to create the handler object. // Create by calling class abc or class xyz. h = Activator.CreateInstance(Type.GetType(className)) }catch(e : Exception){ throw new HttpException("Factory couldn't create instance of type " + className, e) } return IHttpHandler(h) } // Must override this class. function IHttpHandlerFactory.ReleaseHandler(handler : IHttpHandler){ } } // Class definition for abc.aspx handler. class abc implements IHttpHandler{ function IHttpHandler.ProcessRequest(context : HttpContext){ context.Response.Write("<html><body>") context.Response.Write("<p>ABC Handler</p>\r\n") context.Response.Write("</body></html>") } function get IHttpHandler.IsReusable() : Boolean{ return true } } // Class definition for xyz.aspx handler. class xyz implements IHttpHandler{ function IHttpHandler.ProcessRequest(context : HttpContext){ context.Response.Write("<html><body>") context.Response.Write("<p>XYZ Handler</p>\r\n") context.Response.Write("</body></html>") } function get IHttpHandler.IsReusable() : Boolean{ return true } } } //______________________________________________________________ // //To use the above handler factory, use the following lines in a //Web.config file. (remove the comment markers) // //<configuration> // <system.web> // <httpHandlers> // <add verb="*" path="abc.aspx" type="test.MyFactory,HandlerFactoryTest" /> // <add verb="*" path="xyz.aspx" type="test.MyFactory,HandlerFactoryTest" /> // </httpHandlers> // </system.web> //</configuration>
To use the above handler factory, add the following lines to the Web.config file.
<configuration> <system.web> <httpHandlers> <add verb="*" path="abc.aspx" type="test.MyFactory,HandlerFactoryTest"/> <add verb="*" path="xyz.aspx" type="test.MyFactory,HandlerFactoryTest"/> </httpHandlers> </system.web></configuration>
Requirements
Platforms: Windows 2000, Windows XP Professional, Windows Server 2003 family
See Also
IHttpHandlerFactory Interface | IHttpHandlerFactory Members | System.Web Namespace