Moving controllers routes into Sitecore

For a long time I have just done customer API controllers in Sitecore, the way I did them in ASP.NET MVC. By modifying the Global.ascx.cs file.

public static void RegisterRoutes(RouteCollection routes)
                "Profile",                                           // Route name
                "VisitorData",                            // URL with parameters
                new { controller = "Visitor", action = "VisitorDetailsJSON" },
                new[] { "MyCompany.Analytics.Controllers" }  // Parameter defaults

I am working on a project where I am going to deploy package to customer application and I do not want to overwrite their Global.ascx files. This requires me to move the routes into Sitecore and out of the Global.ascx file. Luckily, Sitecore has a pipeline for this.

First we need to write a processor that inherits the Sitecore.Mvc.Pipelines.Loader.InitializeRoutes class.

using System.Web.Mvc;
using System.Web.Routing;
using Sitecore.Pipelines;

namespace MyCompany.Analytics.Pipelines.Initialize
    public class InitRoutes : Sitecore.Mvc.Pipelines.Loader.InitializeRoutes
        public override void Process(PipelineArgs args)
                "Profile", // Route name
                "VisitorData", // URL with parameters
                new {controller = "Visitor", action = "VisitorDetailsJSON"},
                new[] {"MyCompany.Analytics.Controllers"});

Finally we need to add the processor to the Initialize Sitecore pipeline. While researching this, I found several ways that people approached this. I can say that what I have found is that if you don't patch the pipeline before the Sitecore.Mvc.Pipelines.Loader.InitializeRoutes processor, the Tracker.Current object becomes null. I think it breaks the API calls for the Experience Tracker.

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="">
        <processor type="MyCompany.Analytics.Pipelines.Initialize.InitRoutes, MyCompany.Analytics"
          patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']"/>