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>