private void ExploreRouteControllers(IDictionary <string, HttpControllerDescriptor> controllerMappings, IHttpRoute route, Collection <ApiDescription> apiDescriptions) { string routeTemplate = route.RouteTemplate; object controllerVariableValue; if (_controllerVariableRegex.IsMatch(routeTemplate)) { // unbound controller variable, {controller} foreach (KeyValuePair <string, HttpControllerDescriptor> controllerMapping in controllerMappings) { controllerVariableValue = controllerMapping.Key; HttpControllerDescriptor controllerDescriptor = controllerMapping.Value; if (DefaultExplorer.ShouldExploreController(controllerVariableValue.ToString(), controllerDescriptor, route)) { // expand {controller} variable string expandedRouteTemplate = _controllerVariableRegex.Replace(routeTemplate, controllerVariableValue.ToString()); ExploreRouteActions(route, expandedRouteTemplate, controllerDescriptor, apiDescriptions); } } } else { // bound controller variable, {controller = "controllerName"} if (route.Defaults.TryGetValue(ControllerVariableName, out controllerVariableValue)) { HttpControllerDescriptor controllerDescriptor; if (controllerMappings.TryGetValue(controllerVariableValue.ToString(), out controllerDescriptor) && DefaultExplorer.ShouldExploreController(controllerVariableValue.ToString(), controllerDescriptor, route)) { ExploreRouteActions(route, routeTemplate, controllerDescriptor, apiDescriptions); } } } }
private void PopulateActionDescriptions(HttpActionDescriptor actionDescriptor, IHttpRoute route, string localPath, Collection <ApiDescription> apiDescriptions) { string apiDocumentation = GetApiDocumentation(actionDescriptor); // parameters IList <ApiParameterDescription> parameterDescriptions = CreateParameterDescriptions(actionDescriptor); // expand all parameter variables string finalPath; if (!TryExpandUriParameters(route, localPath, actionDescriptor, parameterDescriptions, out finalPath)) { // the action cannot be reached due to parameter mismatch, e.g. routeTemplate = "/users/{name}" and GetUsers(id) return; } // request formatters ApiParameterDescription bodyParameter = parameterDescriptions.FirstOrDefault(description => description.Source == ApiParameterSource.FromBody); IEnumerable <MediaTypeFormatter> supportedRequestBodyFormatters = bodyParameter != null? actionDescriptor.Configuration.Formatters.Where(f => f.CanReadType(bodyParameter.ParameterDescriptor.ParameterType)) : Enumerable.Empty <MediaTypeFormatter>(); // response formatters Type returnType = actionDescriptor.ReturnType; IEnumerable <MediaTypeFormatter> supportedResponseFormatters = returnType != null? actionDescriptor.Configuration.Formatters.Where(f => f.CanWriteType(returnType)) : Enumerable.Empty <MediaTypeFormatter>(); // get HttpMethods supported by an action. Usually there is one HttpMethod per action but we allow multiple of them per action as well. IList <HttpMethod> supportedMethods = DefaultExplorer.GetHttpMethodsSupportedByAction(route, actionDescriptor); foreach (HttpMethod method in supportedMethods) { var description = new ApiDescription() { Documentation = apiDocumentation, HttpMethod = method, RelativePath = finalPath, ActionDescriptor = actionDescriptor, Route = route }; description.SetResponseDescription(CreateResponseDescription(actionDescriptor)); foreach (var mtf in supportedRequestBodyFormatters) { description.SupportedRequestBodyFormatters.Add(mtf); } foreach (var mtf in supportedResponseFormatters) { description.SupportedResponseFormatters.Add(mtf); } foreach (var par in parameterDescriptions) { description.ParameterDescriptions.Add(par); } apiDescriptions.Add(description); } }
private void PopulateActionDescriptions(IEnumerable <HttpActionDescriptor> actionDescriptors, string actionVariableValue, IHttpRoute route, string localPath, Collection <ApiDescription> apiDescriptions) { foreach (HttpActionDescriptor actionDescriptor in actionDescriptors) { if (DefaultExplorer.ShouldExploreAction(actionVariableValue, actionDescriptor, route)) { PopulateActionDescriptions(actionDescriptor, route, localPath, apiDescriptions); } } }