예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
 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);
         }
     }
 }