Пример #1
0
        public void CompareTo_RespectsOrder(int prefixOrder1, int prefixOrder2, int order1, int order2, int expectedValue)
        {
            HttpRouteEntry x = new HttpRouteEntry() { PrefixOrder = prefixOrder1, Order = order1 };
            HttpRouteEntry y = new HttpRouteEntry() { PrefixOrder = prefixOrder2, Order = order2 };

            Assert.Equal(expectedValue, x.CompareTo(y));
        }
        private static void AddRouteEntries(List <HttpRouteEntry> routes, string actionName, string routePrefix,
                                            Collection <IHttpRouteInfoProvider> routeProviders,
                                            IEnumerable <ReflectedHttpActionDescriptor> actionDescriptors)
        {
            foreach (IHttpRouteInfoProvider routeProvider in routeProviders)
            {
                HttpRouteEntry entry = CreateRouteEntry(actionName, routePrefix, routeProvider, actionDescriptors);
                bool           mergedWithExistingEntry = false;

                if (String.IsNullOrEmpty(entry.Name))
                {
                    // Merge unnamed entries with the exact same template and order.
                    HttpRouteEntry existingMatch = routes.SingleOrDefault(
                        e => String.IsNullOrEmpty(e.Name) &&
                        String.Equals(e.Template, entry.Template, StringComparison.Ordinal) &&
                        e.Order == entry.Order);

                    if (existingMatch != null)
                    {
                        mergedWithExistingEntry = true;

                        foreach (ReflectedHttpActionDescriptor descriptor in actionDescriptors)
                        {
                            existingMatch.Actions.Add(descriptor);
                        }
                    }
                }

                if (!mergedWithExistingEntry)
                {
                    routes.Add(entry);
                }
            }
        }
Пример #3
0
        private static decimal GetPrecedence(string attributeRouteTemplate)
        {
            DefaultInlineConstraintResolver resolver    = new DefaultInlineConstraintResolver();
            HttpRouteValueDictionary        defaults    = new HttpRouteValueDictionary();
            HttpRouteValueDictionary        constraints = new HttpRouteValueDictionary();
            string standardRouteTemplate = InlineRouteTemplateParser.ParseRouteTemplate(attributeRouteTemplate,
                                                                                        defaults, constraints, new DefaultInlineConstraintResolver());
            HttpParsedRoute parsedRoute = HttpRouteParser.Parse(standardRouteTemplate);

            return(HttpRouteEntry.GetPrecedence(parsedRoute, constraints));
        }
Пример #4
0
        public void CompareTo_RespectsOrder(int order1, int order2, int expectedValue)
        {
#if ASPNETWEBAPI
            var x = new HttpRouteEntry();
            var y = new HttpRouteEntry();
#else
            var x = new RouteEntry();
            var y = new RouteEntry();
#endif

            x.Order = order1;
            y.Order = order2;

            Assert.Equal(expectedValue, x.CompareTo(y));
        }
Пример #5
0
        public void CompareTo_RespectsOrder(int order1, int order2, int expectedValue)
        {
#if ASPNETWEBAPI
            var x = new HttpRouteEntry();
            var y = new HttpRouteEntry();
#else
            var x = new RouteEntry();
            var y = new RouteEntry();
#endif

            x.Order = order1;
            y.Order = order2;

            Assert.Equal(expectedValue, x.CompareTo(y));
        }
        private static IEnumerable<HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor)
        {
            IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector();
            ILookup<string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor);
            if (actionMap == null)
            {
                return Enumerable.Empty<HttpRouteEntry>();
            }

            List<HttpRouteEntry> routes = new List<HttpRouteEntry>();
            string routePrefix = GetRoutePrefix(controllerDescriptor);
            Collection<IHttpRouteInfoProvider> defaultRouteProviders = GetDefaultRouteTemplate(controllerDescriptor);
                        
            foreach (IGrouping<string, HttpActionDescriptor> actionGrouping in actionMap)
            {
                string actionName = actionGrouping.Key;

                foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType<ReflectedHttpActionDescriptor>())
                {
                    Collection<IHttpRouteInfoProvider> routeProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false);
                    if (routeProviders.Count == 0)
                    {
                        // IF there are no routes on the specific action, then use the one provided via the DefaultRouteAttribute.
                        if (defaultRouteProviders != null)
                        {
                            routeProviders = defaultRouteProviders;
                        }
                    }

                    foreach (IHttpRouteInfoProvider routeProvider in routeProviders)
                    {
                        string providerTemplate = routeProvider.RouteTemplate;
                        if (providerTemplate == null)
                        {
                            continue;
                        }

                        if (providerTemplate.StartsWith("/", StringComparison.Ordinal))
                        {
                            throw Error.InvalidOperation(SRResources.AttributeRoutes_InvalidTemplate, providerTemplate, actionName);
                        }

                        string routeTemplate = BuildRouteTemplate(routePrefix, providerTemplate);

                        IEnumerable<HttpMethod> verbs = actionDescriptor.SupportedHttpMethods;

                        // Try to find an entry with the same route template and the same HTTP verbs
                        HttpRouteEntry existingEntry = null;
                        foreach (HttpRouteEntry entry in routes)
                        {
                            if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) &&
                                    AreEqual(verbs, entry.HttpMethods))
                            {
                                existingEntry = entry;
                                break;
                            }
                        }

                        if (existingEntry == null)
                        {
                            HttpRouteEntry entry = new HttpRouteEntry()
                            {
                                RouteTemplate = routeTemplate,
                                Actions = new HashSet<ReflectedHttpActionDescriptor>() { actionDescriptor }
                            };

                            entry.HttpMethods = verbs;
                            entry.Name = routeProvider.RouteName;
                            entry.Order = routeProvider.RouteOrder;
                            routes.Add(entry);
                        }
                        else
                        {
                            existingEntry.Actions.Add(actionDescriptor);

                            // Take the minimum of the two orders as the order
                            int order = routeProvider.RouteOrder;
                            if (order < existingEntry.Order)
                            {
                                existingEntry.Order = order;
                            }

                            // Use the provider route name if the route hasn't already been named
                            if (existingEntry.Name == null)
                            {
                                existingEntry.Name = routeProvider.RouteName;
                            }
                        }
                    }
                }
            }

            return routes;
        }
Пример #7
0
        private static IEnumerable <HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor)
        {
            IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector();
            ILookup <string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor);

            if (actionMap == null)
            {
                return(Enumerable.Empty <HttpRouteEntry>());
            }

            List <HttpRouteEntry> routes = new List <HttpRouteEntry>();
            string routePrefix           = GetRoutePrefix(controllerDescriptor);

            foreach (IGrouping <string, HttpActionDescriptor> actionGrouping in actionMap)
            {
                string actionName = actionGrouping.Key;

                foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType <ReflectedHttpActionDescriptor>())
                {
                    foreach (IHttpRouteInfoProvider routeProvider in actionDescriptor.GetCustomAttributes <IHttpRouteInfoProvider>(inherit: false))
                    {
                        string providerTemplate = routeProvider.RouteTemplate;
                        if (providerTemplate == null)
                        {
                            continue;
                        }

                        if (providerTemplate.StartsWith("/", StringComparison.Ordinal))
                        {
                            throw Error.InvalidOperation(SRResources.AttributeRoutes_InvalidTemplate, providerTemplate, actionName);
                        }

                        string routeTemplate = BuildRouteTemplate(routePrefix, providerTemplate);

                        // Try to find an entry with the same route template and the same HTTP verbs
                        HttpRouteEntry existingEntry = null;
                        foreach (HttpRouteEntry entry in routes)
                        {
                            if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) &&
                                AreEqual(routeProvider.HttpMethods, entry.HttpMethods))
                            {
                                existingEntry = entry;
                                break;
                            }
                        }

                        if (existingEntry == null)
                        {
                            HttpRouteEntry entry = new HttpRouteEntry()
                            {
                                RouteTemplate = routeTemplate,
                                Actions       = new HashSet <ReflectedHttpActionDescriptor>()
                                {
                                    actionDescriptor
                                }
                            };

                            entry.HttpMethods = routeProvider.HttpMethods;
                            entry.Name        = routeProvider.RouteName;
                            entry.Order       = routeProvider.RouteOrder;
                            routes.Add(entry);
                        }
                        else
                        {
                            existingEntry.Actions.Add(actionDescriptor);

                            // Take the minimum of the two orders as the order
                            int order = routeProvider.RouteOrder;
                            if (order < existingEntry.Order)
                            {
                                existingEntry.Order = order;
                            }

                            // Use the provider route name if the route hasn't already been named
                            if (existingEntry.Name == null)
                            {
                                existingEntry.Name = routeProvider.RouteName;
                            }
                        }
                    }
                }
            }

            return(routes);
        }
Пример #8
0
 public int CompareTo(HttpRouteEntry other)
Пример #9
0
        // Default ordering goes through segments one by one and tries to apply an ordering
#if ASPNETWEBAPI
        private static int Compare(HttpRouteEntry entry1, HttpRouteEntry entry2)
        private static List<HttpRouteEntry> CreateAttributeRoutes(HttpRouteBuilder routeBuilder, string controllerName,
            Collection<RoutePrefixAttribute> routePrefixes, IGrouping<string, HttpActionDescriptor> actionGrouping)
        {
            List<HttpRouteEntry> routes = new List<HttpRouteEntry>();
            string actionName = actionGrouping.Key;

            foreach (HttpActionDescriptor actionDescriptor in actionGrouping)
            {
                IEnumerable<IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false);

                // DefaultIfEmpty below is required to add routes when there is a route prefix but no
                // route provider or when there is a route provider with a template but no route prefix
                foreach (RoutePrefixAttribute routePrefix in routePrefixes.DefaultIfEmpty())
                {
                    foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty())
                    {
                        string prefixTemplate = routePrefix == null ? null : routePrefix.Prefix;
                        string providerTemplate = routeProvider == null ? null : routeProvider.RouteTemplate;
                        if (prefixTemplate == null && providerTemplate == null)
                        {
                            continue;
                        }

                        ValidateTemplates(prefixTemplate, providerTemplate, actionDescriptor);

                        string routeTemplate;
                        if (String.IsNullOrEmpty(prefixTemplate))
                        {
                            routeTemplate = providerTemplate ?? String.Empty;
                        }
                        else if (String.IsNullOrEmpty(providerTemplate))
                        {
                            routeTemplate = prefixTemplate;
                        }
                        else
                        {
                            // template and prefix both not null - combine them
                            routeTemplate = prefixTemplate + '/' + providerTemplate;
                        }

                        Collection<HttpMethod> httpMethods = actionDescriptor.SupportedHttpMethods;
                        IHttpRoute route = routeBuilder.BuildHttpRoute(routeTemplate, httpMethods, controllerName, actionName);
                        HttpRouteEntry entry = new HttpRouteEntry() { Route = route, RouteTemplate = routeTemplate };
                        if (routeProvider != null)
                        {
                            entry.Name = routeProvider.RouteName;
                            entry.Order = routeProvider.RouteOrder;
                        }
                        if (routePrefix != null)
                        {
                            entry.PrefixOrder = routePrefix.Order;
                        }
                        routes.Add(entry);
                    }
                }
            }

            SetDefaultRouteNames(routes, controllerName, actionName);

            return routes;
        }
        private static IEnumerable<HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor)
        {
            IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector();
            ILookup<string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor);
            if (actionMap == null)
            {
                return Enumerable.Empty<HttpRouteEntry>();
            }

            List<HttpRouteEntry> routes = new List<HttpRouteEntry>();
            RoutePrefixAttribute routePrefix = controllerDescriptor.GetCustomAttributes<RoutePrefixAttribute>(inherit: false).SingleOrDefault();

            foreach (IGrouping<string, HttpActionDescriptor> actionGrouping in actionMap)
            {
                string actionName = actionGrouping.Key;

                foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType<ReflectedHttpActionDescriptor>())
                {
                    IEnumerable<IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false);

                    foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty())
                    {
                        string routeTemplate = BuildRouteTemplate(routePrefix, routeProvider, controllerDescriptor.ControllerName);
                        if (routeTemplate == null)
                        {
                            continue;
                        }

                        // Try to find an entry with the same route template and the same HTTP verbs
                        HttpRouteEntry existingEntry = null;
                        foreach (HttpRouteEntry entry in routes)
                        {
                            if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) &&
                                    AreEqual(routeProvider.HttpMethods, entry.HttpMethods))
                            {
                                existingEntry = entry;
                                break;
                            }
                        }

                        if (existingEntry == null)
                        {
                            HttpRouteEntry entry = new HttpRouteEntry()
                            {
                                RouteTemplate = routeTemplate,
                                Actions = new HashSet<ReflectedHttpActionDescriptor>() { actionDescriptor }
                            };

                            if (routeProvider != null)
                            {
                                entry.HttpMethods = routeProvider.HttpMethods;
                                entry.Name = routeProvider.RouteName;
                                entry.Order = routeProvider.RouteOrder;
                            }
                            routes.Add(entry);
                        }
                        else
                        {
                            existingEntry.Actions.Add(actionDescriptor);

                            // Take the minimum of the two orders as the order
                            int order = routeProvider == null ? 0 : routeProvider.RouteOrder;
                            if (order < existingEntry.Order)
                            {
                                existingEntry.Order = order;
                            }

                            // Use the provider route name if the route hasn't already been named
                            if (routeProvider != null && existingEntry.Name == null)
                            {
                                existingEntry.Name = routeProvider.RouteName;
                            }
                        }
                    }
                }
            }

            return routes;
        }
        private static List <HttpRouteEntry> CreateAttributeRoutes(HttpRouteBuilder routeBuilder, string controllerName,
                                                                   Collection <RoutePrefixAttribute> routePrefixes, IGrouping <string, HttpActionDescriptor> actionGrouping)
        {
            List <HttpRouteEntry> routes = new List <HttpRouteEntry>();
            string actionName            = actionGrouping.Key;

            foreach (HttpActionDescriptor actionDescriptor in actionGrouping)
            {
                IEnumerable <IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes <IHttpRouteInfoProvider>(inherit: false);

                // DefaultIfEmpty below is required to add routes when there is a route prefix but no
                // route provider or when there is a route provider with a template but no route prefix
                foreach (RoutePrefixAttribute routePrefix in routePrefixes.DefaultIfEmpty())
                {
                    foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty())
                    {
                        string prefixTemplate   = routePrefix == null ? null : routePrefix.Prefix;
                        string providerTemplate = routeProvider == null ? null : routeProvider.RouteTemplate;
                        if (prefixTemplate == null && providerTemplate == null)
                        {
                            continue;
                        }

                        ValidateTemplates(prefixTemplate, providerTemplate, actionDescriptor);

                        string routeTemplate;
                        if (String.IsNullOrEmpty(prefixTemplate))
                        {
                            routeTemplate = providerTemplate ?? String.Empty;
                        }
                        else if (String.IsNullOrEmpty(providerTemplate))
                        {
                            routeTemplate = prefixTemplate;
                        }
                        else
                        {
                            // template and prefix both not null - combine them
                            routeTemplate = prefixTemplate + '/' + providerTemplate;
                        }

                        Collection <HttpMethod> httpMethods = actionDescriptor.SupportedHttpMethods;
                        IHttpRoute     route = routeBuilder.BuildHttpRoute(routeTemplate, httpMethods, controllerName, actionName);
                        HttpRouteEntry entry = new HttpRouteEntry()
                        {
                            Route = route, RouteTemplate = routeTemplate
                        };
                        if (routeProvider != null)
                        {
                            entry.Name  = routeProvider.RouteName;
                            entry.Order = routeProvider.RouteOrder;
                        }
                        if (routePrefix != null)
                        {
                            entry.PrefixOrder = routePrefix.Order;
                        }
                        routes.Add(entry);
                    }
                }
            }

            SetDefaultRouteNames(routes, controllerName, actionName);

            return(routes);
        }