views:

408

answers:

1

I am using System.Web.Routing with ASP.NET (3.5) Web Forms that will URL rewrite the following URL from

to

The code is as below:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add("CampaignRoute", new Route
                                    (
                                    "{campaign_code}",
                                    new CustomRouteHandler("~/default.aspx")
                                    ));
}

IRouteHandler implementation:

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        if (requestContext.RouteData.Values.ContainsKey("campaign_code"))
        {
            var code = requestContext.RouteData.Values["campaign_code"].ToString();

            HttpContext.Current.RewritePath(
                string.Concat(
                    VirtualPath,
                    "?campaign=" + code));
        }

        var page = BuildManager.CreateInstanceFromVirtualPath
                       (VirtualPath, typeof(Page)) as IHttpHandler;

        return page;
    }

However I noticed there are too many things to change on my existing aspx pages (i.e. links to javascript, links to css files).

  1. So I am thinking if there's a way to keep above code but in the end rather than a rewrite just do a Request.Redirect or Server.Transfer to minimize the changes needed. So the purpose of using System.Web.Routing becomes solely for URL friendly on the first entry.

  2. How to ignore the rest of the patterns other than specificed in the code?

Thanks.

+1  A: 

Using rewriting combined with ASP.NET URL Routing is not recommended because some implementations of ASP.NET URL Routing internally use rewriting as well (it depends on the version of ASP.NET). The combination of two different components using rewriting can cause conflicts (though I'm not 100% sure that that's why you're seeing this problem).

Regarding using transfer/redirect/rewrite:

My strongest recommendation would be to not use any of them! Instead of redirecting (or anything else) just let the page be called directly by ASP.NET by returning it from the IRouteHandler, much as you are already doing (just without the call to Rewrite). As long as your IRouteHandler saves the RouteData somewhere, the Page can then get the data from the route and you should be good to go.

Take a look at Phil Haack's Web Form routing sample to see an example of how to save the route data (or just use his code!).

Regarding ignoring patterns:

You can use an IRouteConstraint to constrain which URLs match your route. There is a built-in default route constraint implementation that uses regular expressions, but you can also write custom route constraints. Here is an example:

Route r = new Route(...);
r.Constraints = new RouteValueDictionary(new {
    campaign_code = "\d{5}", // constrain to 5-digit numbers only
    other_value = new CustomRouteConstraint(), // call custom constraint
});

CustomRouteConstraint is a class that you can write that derives from IRouteConstraint.

One thing I should note about static files such as CSS and JPG files is that by default they are always excluded from routing. By default routing ignores patterns that exactly match physical files on disk. You can change this behavior by setting RouteTable.Routes.RouteExistingFiles = true, but that is not the default.

Eilon
Can I ask what are the differences between URL rewrite and URL routing? Sorry if I am being an idiot here but I really don't know.
Jeffrey C
URL rewriting in the ASP.NET sense is an intermediate step that can alter how the current request is being processed by changing the internal URL that ASP.NET is using. URL Routing is a new feature that avoids the need to use URL Rewriting by directly mapping an incomgin request to an IHttpHandler.
Eilon