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