Chris Pietschmann

husband, father, hacker, entrepreneur, futurist, innovator, autodidact

NAVIGATION - SEARCH

URL Mapping for ASP.NET 1.1

With the help of an http module, a custom config handler and a few lines of code we can add the same ASP.NET 2.0 style URL Mapping to our ASP.NET 1.1 apps.

1) First lets start by creating a new Class Library project named 'URLMapping_HTTPModule'

2) Then create three files as listed below:

BaseModuleRewriter.vb

Imports System.Web

Public Class BaseModuleRewriter
    Implements System.Web.IHttpModule

    Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
        AddHandler app.AuthorizeRequest, AddressOf Me.BaseModuleRewriter_AuthorizeRequest
    End Sub

    Sub Dispose() Implements System.Web.IHttpModule.Dispose
    End Sub

    Sub BaseModuleRewriter_AuthorizeRequest(ByVal sender As Object, ByVal e As EventArgs)
        Dim app As HttpApplication = CType(sender, HttpApplication)
        Rewrite(app.Request.Path, app)
    End Sub

    Overridable Sub Rewrite(ByVal requestedPath As String, ByVal app As HttpApplication)
    End Sub

End Class

URLMappingModule.vb

Imports System.Web
Imports System.Configuration

Public Class URLMappingModule
    Inherits BaseModuleRewriter

    Overrides Sub Rewrite(ByVal requestedPath As String, ByVal app As HttpApplication)
        ''Implement functionality here that mimics the 'URL Mapping' features of ASP.NET 2.0
        Dim config As UrlMappingsConfigHandler = CType(ConfigurationSettings.GetConfig("system.web/urlMappings"), UrlMappingsConfigHandler)

        Dim pathOld As String, queryStringArg As String, pathNew As String = ""
        If config.Enabled Then
            pathOld = app.Request.RawUrl

            ''Get the request page without the querystring parameters
            Dim requestedPage As String = app.Request.RawUrl.ToLower
            If requestedPage.IndexOf("?") > -1 Then
                requestedPage = requestedPage.Substring(0, requestedPage.IndexOf("?"))
            End If

            ''Format the requested page (url) to have a ~ instead of the virtual path of the app
            Dim appVirtualPath As String = app.Request.ApplicationPath
            If requestedPage.Length >= appVirtualPath.Length Then
                If requestedPage.Substring(0, appVirtualPath.Length).ToLower = appVirtualPath.ToLower Then
                    requestedPage = requestedPage.Substring(appVirtualPath.Length)
                    If requestedPage.Substring(0, 1) = "/" Then
                        requestedPage = "~" & requestedPage
                    Else
                        requestedPage = "~/" & requestedPage
                    End If
                End If
            End If

            ''Get the new path to rewrite the url to if it meets one
            ''of the defined virtual urls.
            pathNew = config.MappedUrl(requestedPage)

            ''If the requested url matches one of the virtual one
            ''the lets go and rewrite it.
            If pathNew.Length > 0 Then
                If pathNew.IndexOf("?") > -1 Then
                    ''The matched page has a querystring defined
                    If pathOld.IndexOf("?") > -1 Then
                        pathNew += "&" & Right(pathOld, pathOld.Length - pathOld.IndexOf("?") - 1)
                    End If
                Else
                    ''The matched page doesn't have a querystring defined
                    If pathOld.IndexOf("?") > -1 Then
                        pathNew += Right(pathOld, pathOld.Length - pathOld.IndexOf("?"))
                    End If
                End If

                ''Rewrite to the new url
                app.Context.Current.RewritePath(pathNew)
            End If

        End If
    End Sub

End Class

UrlMappingsConfigHandler.vb

Imports System.Configuration
Imports System.Xml

Public Class UrlMappingsConfigHandler
Implements IConfigurationSectionHandler
Dim _Section As XmlNode

Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
    _Section = section
    Return Me
End Function

Friend Function Enabled() As Boolean
    ''' Get whether url mapping is enabled in the app.config
    If _Section.Attributes("enabled").Value.ToLower = "true" Then
        Return True
    Else
        Return False
    End If
End Function

Friend Function MappedUrl(ByVal url As String) As String
    ''' Get the matching "mapped Url" from the web.config file if there is one.
    Dim x As XmlNode
    Dim _mappedURL As String = ""
    For Each x In _Section.ChildNodes
        If url.ToLower = x.Attributes("url").Value.ToLower Then
            _mappedURL = x.Attributes("mappedUrl").Value
        End If
    Next
    Return _mappedURL
End Function

3) Now in the ASP.NET 1.1 app that you would like to use this in, just add the following lines to your web.config file:


<?xml version="1.0" encoding="utf-8" ?> <configuration>  <!-- Declare the custom 'urlMappings' section and handler -->  <configSections>         <sectionGroup name="system.web">             <section name="urlMappings" type="URLMapping_HTTPModule.UrlMappingsConfigHandler,URLMapping_HTTPModule"/>         </sectionGroup>     </configSections>      <system.web>   <!-- Tell ASP.NET to use the URL Mapping HTTP Module -->   <httpModules>    <add type="URLMapping_HTTPModule.URLMappingModule, URLMapping_HTTPModule" name="URLMappingModule" />   </httpModules>     <!-- This is the custom 'urlMappings' section -->   <urlMappings enabled="true">    <add     url="~/Chris.aspx"     mappedUrl="~/Default.aspx?p=chris" />    <add     url="~/Kate.aspx"     mappedUrl="~/Default.aspx?p=kate" />    <add     url="~/folder/test.aspx"     mappedUrl="~/Default.aspx?p=foldertest" />   </urlMappings>  </system.web> </configuration>

blog comments powered by Disqus