The following code example demonstrates how to create custom handler objects in response to a client request. The example has two parts:
The first part of the example shows how to create 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.
' 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
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
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>
// 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
{
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
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>
*/
package test;
// Name this J# file HandlerFactoryTest.jsl and compile it with the
// command line: vjc /t:Library /r:System.Web.dll HandlerFactoryTest.jsl.
// Copy HandlerFactoryTest.dll to your \bin directory.
import System.*;
import 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 implements IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, String requestType,
String url, String pathTranslated) throws HttpException
{
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 (System.Exception e) {
throw new HttpException("Factory couldn't create instance "
+ "of type " + className, e);
}
return ((IHttpHandler)h);
} //GetHandler
// This is a must override method.
public void ReleaseHandler(IHttpHandler handler)
{
} //ReleaseHandler
} //MyFactory
// Class definition for abc.aspx handler.
public class abc implements IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.get_Response().Write("<html><body>");
context.get_Response().Write("<p>ABC Handler</p>\n");
context.get_Response().Write("</body></html>");
} //ProcessRequest
/** @property
*/
public boolean get_IsReusable()
{
return true;
} //get_IsReusable
} //abc
// Class definition for xyz.aspx handler.
public class xyz implements IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.get_Response().Write("<html><body>");
context.get_Response().Write("<p>XYZ Handler</p>\n");
context.get_Response().Write("</body></html>");
} //ProcessRequest
/** @property
*/
public boolean get_IsReusable()
{
return true;
} //get_IsReusable
} //xyz
/*
______________________________________________________________
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>
*/
// 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>
The second part of the example shows a Web.config file excerpt. 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>