private Collection <ApiDescription> InitializeApiDescriptions()
        {
            Collection <ApiDescription> apiDescriptions    = new Collection <ApiDescription>();
            IHttpControllerSelector     controllerSelector = _config.Services.GetHttpControllerSelector();
            IDictionary <string, HttpControllerDescriptor> controllerMappings = controllerSelector.GetControllerMapping();

            if (controllerMappings != null)
            {
                ApiDescriptionComparer descriptionComparer = new ApiDescriptionComparer();
                foreach (IHttpRoute route in FlattenRoutes(_config.Routes))
                {
                    CandidateAction[] directRouteCandidates = route.GetDirectRouteCandidates();

                    HttpControllerDescriptor    directRouteController = GetDirectRouteController(directRouteCandidates);
                    Collection <ApiDescription> descriptionsFromRoute =
                        (directRouteController != null && directRouteCandidates != null) ?
                        ExploreDirectRoute(directRouteController, directRouteCandidates, route) :
                        ExploreRouteControllers(controllerMappings, route);

                    // Remove ApiDescription that will lead to ambiguous action matching.
                    // E.g. a controller with Post() and PostComment(). When the route template is {controller}, it produces POST /controller and POST /controller.
                    descriptionsFromRoute = RemoveInvalidApiDescriptions(descriptionsFromRoute);

                    foreach (ApiDescription description in descriptionsFromRoute)
                    {
                        apiDescriptions.Add(description);
                    }
                }
            }

            return(apiDescriptions);
        }
Example #2
0
        private Collection <ApiDescription> InitializeApiDescriptions()
        {
            Collection <ApiDescription> apiDescriptions    = new Collection <ApiDescription>();
            IHttpControllerSelector     controllerSelector =
                _config.Services.GetHttpControllerSelector();
            IDictionary <string, HttpControllerDescriptor> controllerMappings =
                controllerSelector.GetControllerMapping();

            if (controllerMappings != null)
            {
                ApiDescriptionComparer descriptionComparer = new ApiDescriptionComparer();
                foreach (IHttpRoute route in FlattenRoutes(_config.Routes))
                {
                    CandidateAction[] directRouteCandidates = route.GetDirectRouteCandidates();

                    HttpControllerDescriptor directRouteController = GetDirectRouteController(
                        directRouteCandidates
                        );
                    Collection <ApiDescription> descriptionsFromRoute =
                        (directRouteController != null && directRouteCandidates != null)
                            ? ExploreDirectRoute(
                            directRouteController,
                            directRouteCandidates,
                            route
                            )
                            : ExploreRouteControllers(controllerMappings, route);

                    // Remove ApiDescription that will lead to ambiguous action matching.
                    // E.g. a controller with Post() and PostComment(). When the route template is {controller}, it produces POST /controller and POST /controller.
                    descriptionsFromRoute = RemoveInvalidApiDescriptions(descriptionsFromRoute);

                    foreach (ApiDescription description in descriptionsFromRoute)
                    {
                        // Do not add the description if the previous route has a matching description with the same HTTP method and relative path.
                        // E.g. having two routes with the templates "api/Values/{id}" and "api/{controller}/{id}" can potentially produce the same
                        // relative path "api/Values/{id}" but only the first one matters.
                        if (!apiDescriptions.Contains(description, descriptionComparer))
                        {
                            apiDescriptions.Add(description);
                        }
                    }
                }
            }

            return(apiDescriptions);
        }