private RavenRouteCollectionRouteData LocateRouteData(string virtualPathRoot, HttpRequestMessage request)
        {
            var matches = (
                from route in subRoutes
                let match = route.GetRouteData(virtualPathRoot, request)
                            where match != null
                            select new { match, route }
                ).ToArray();

            var matchesTemplateRoutes = matches.Select(m => m.match.Route.RouteTemplate).Distinct();
            var result = matches.Length == 0 ? null : new RavenRouteCollectionRouteData(this, matches.Select(x => x.match).ToArray());
            var routes = matches.Select(x => x.route).ToArray();

            foreach (var matchRoute in matchesTemplateRoutes)
            {
                var subRoute = new SubRoute(request.RequestUri.LocalPath);
                subRoute.ReduceRouteMatchTemplate(matchRoute);
                routDataCache.TryAdd(Tuple.Create(request.Method.Method, subRoute), routes);
            }
            return(result);
        }