Jack
Jack

Reputation: 7557

Ignoring routing for .asp pages Asp.Net 4.0 routing

I have this MapPageRoute in my global.asax:

RouteTable.Routes.MapPageRoute("TestPages", "{file}", "~/Test/{file}");

It basically says if request comes for any file it goes to Test folder. However I want to restrict it such that this rule only gets executed when asp extension is not there in URL. So, if user types Test.asp, no URL routing should happen. But if it something like http://www.something.com/Test/ this route should be executed.

How can I achieve that?

Upvotes: 1

Views: 1495

Answers (2)

PsychoDUCK
PsychoDUCK

Reputation: 1103

To ignore a route try using the following:

RouteTable.Routes.Ignore("{resource}.asp/{*pathInfo}");

Change '.asp' to the type you want to filter.

Upvotes: 2

ScottE
ScottE

Reputation: 21630

I use a constraint for this purpose. Example:

routes.MapPageRoute("CMS", "{*friendlyUrl}", "~/index.aspx", true, null, new RouteValueDictionary { { "incomingUrl", new CatchallConstraint() } });

Where CatchallContraint is a class that must implement IRouteConstraint.

In the Match method, just check for the file extension, and return false if it's an asp extension.

Here's my implementation (vb.net) - it's a bit more than you need as it's configurable in the web.config, but you get the idea.

Public Class CatchallConstraint Implements System.Web.Routing.IRouteConstraint

''' <summary>
''' If AppSettings: CatchallIgnoredExtensions doesn't exist, these are the default extensions to ignore in the catch-all route
''' </summary>
''' <remarks></remarks>
Public Const DefaultIgnoredExtensions As String = ".jpg,.gif,.png"

''' <summary>
''' For the catch-all route, checks the AppSettings: CatchallIgnoredExtensions to determine if the route should be ignored.
''' Generally this is for images - if we got to here that means the image was not found, and there's no need to follow this route
''' </summary>
Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
    If routeDirection = Routing.RouteDirection.IncomingRequest Then
        Dim friendlyUrl As String = Nothing
        If values.TryGetValue("friendlyUrl", friendlyUrl) AndAlso Not String.IsNullOrEmpty(friendlyUrl) Then
            If friendlyUrl.Contains(".") Then
                Dim catchallIgnoredExtensions As String = ConfigurationManager.AppSettings("CatchallIgnoredExtensions")
                ' only set defaults if the setting is not found - user may not want to ignore any extensions
                If catchallIgnoredExtensions Is Nothing Then
                    catchallIgnoredExtensions = DefaultIgnoredExtensions
                End If
                ' replace spaces and period to standardize, surround the extensions in commas for searching
                catchallIgnoredExtensions = "," & catchallIgnoredExtensions.Replace(" ", "").Replace(".", "").ToLowerInvariant() & ","
                Dim extension As String = System.IO.Path.GetExtension(friendlyUrl).Replace(".", "")
                If catchallIgnoredExtensions.Contains("," & extension & ",") Then
                    Return False
                End If
            End If
        End If
    End If
    Return True
End Function

End Class

Upvotes: 2

Related Questions