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); }