URL Rewriting using IHttpHandlerFactory

N

Netveloper

Hi,

I'm playing around with url rewriting and I have come across a problem which
I
can't seem to get past. The general ide is to have a IHttpHandlerFactory
class
which checks the incoming request url against a set of predefined rules and
creates and return the appropriate IHttpHandler implementation.

Inside the IHttpHandler implementations, the request is examined and
interpreted
in the correct way. In short they parse a request into a new url (for
example, could
also be a handler to generate an rss-feed or whatever, hence the need for
the
factory and set of rules) and rewrites it using context.RewritePath()

My problem is (verified by stepping the debugger) is that the factory
creates the
correct Handler.. and the andler interprets the request and calls
RewritePath()
but the page is not displayed in my browser, instead a blank page is shown.

Basicly this is the setup of the testsite (used to reproduce the problem) is
as
follows

Root
Test
one.aspx
two.aspx
Webform.aspx

The URL Rewriting should be able to take Root/Test/1.aspx and rewrite it
into
Root/Test/one.aspx and the same for 2/two.aspx - so it's a very basic test
setup.

The handler which is created it setup as following

// CustomHandler.vb
Public Class CustomHandler
Implements IHttpHandler

Public ReadOnly Property IsReusable() As Boolean Implements
System.Web.IHttpHandler.IsReusable
Get
Return False
End Get
End Property

Public Sub ProcessRequest(ByVal context As System.Web.HttpContext)
Implements System.Web.IHttpHandler.ProcessRequest

Dim TargetPage As String = _
Regex.Match(context.Request.Url.AbsolutePath, "[0-9]+\.aspx",
RegexOptions.IgnoreCase).Value

If (Not TargetPage Is Nothing) Then
Select Case TargetPage
Case "1.aspx"
context.RewritePath("~/test/one.aspx")
Case "2.aspx"
context.RewritePath("~/test/two.aspx")
End Select
End If

End Sub

End Class

The factory implementation (remember it's not bulletproof, it's a test app
to reproduce the issue at hand)

Public Class HttpRewriter
Implements IHttpHandlerFactory

Public Function GetHandler(ByVal context As System.Web.HttpContext,
ByVal requestType As String, ByVal url As String, ByVal pathTranslated As
String) As System.Web.IHttpHandler Implements
System.Web.IHttpHandlerFactory.GetHandler

Dim TargetPage As String = _
Regex.Match(context.Request.Url.AbsolutePath, "[0-9]+\.aspx",
RegexOptions.IgnoreCase).Value

If (TargetPage.Length = 0) Then
Return PageParser.GetCompiledPageInstance(url, pathTranslated,
context)
End If

Return New CustomHandler

End Function

Public Sub ReleaseHandler(ByVal handler As System.Web.IHttpHandler)
Implements System.Web.IHttpHandlerFactory.ReleaseHandler

End Sub

End Class

the factory has been added to web.config and all is fine.. When debugging I
can see that when I enter
http://localhost/myapp/test/1.aspx the factory reaches the "Return New
CustomHandler" line and execution
is shifted over to the new objects ProcessRequest method. Continuing to step
the code and I see it hits the
Case "1.aspx" in the select block, as expected and calls
context.RewritePath("~/test/one.aspx")

This is when I'm left with a blank page. I have my sucpicions, i.e there is
no compiled instance of the real
page (one.aspx) returned from my handler (and I can't since it's a sub) ..
how would .NET know how to
render my page then? I've seen this design before in the .Text blog engine
source code, but I've been
unable to get it to work.

Please remember that this is a basic test setup used to reproduce the
problem, in hope that someone can
point how the (obvious?) misstake I'm making. I need for a factory to create
different handlers based on
the requested path, so I can't do it like in a few articles I've seen where
they rewrite the path and call
GetCompiledPageInstance .. both done in the factory ..

I figure my handler is correct, but the problem is in my factory.. perhaps I
need to do something to my
handler object before I return it in the factory?

Any advice, suggestions, pointers, help etc is apprechiated! Don't worry
about the VB.NET part i code
C# as well so don't feel hindred by the code :p

Thanks!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top