Hi.
What I want is to develop an application to explore ApiControllers in external assemblies in order to generate documentation (for example, Word or txt document).
I know about Web Api Help Page but it is not what I need.
I have an assembly:
var assembly = Assembly.LoadFrom(name);
I've tried 2 ways.
Way 1: CustomAssemblyResolver and ApiExplorer
public class CustomAssemblyResolver : DefaultAssembliesResolver { private readonly Assembly assembly; public CustomAssemblyResolver(Assembly assembly) { this.assembly = assembly; } public ICollection<Assembly> GetAssemblies() { return new[] { this.assembly }; } } private void GenerateAssemblyDescription(Assembly assembly) { var httpConfiguration = new HttpConfiguration();
httpConfiguration.Services.Replace(typeof(IDocumentationProvider), this.context.XmlDocumentationProvider); httpConfiguration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver(assembly)); var apiDescriptions = httpConfiguration.Services.GetApiExplorer().ApiDescriptions; // <-- Empty }
But in this case I can't get apiDescriptions.
Way 2: Reflexion and HttpActionDescriptor
private void GenerateAssemblyDescription(Assembly assembly, IEnumerable<string> namespaceNames) { // var httpConfiguration = new HttpConfiguration(); // httpConfiguration.Services.Replace(typeof(IDocumentationProvider), this.context.XmlDocumentationProvider); // httpConfiguration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver(assembly)); // var apiDescriptions = httpConfiguration.Services.GetApiExplorer().ApiDescriptions; foreach (var namespaceName in namespaceNames.OrderBy(x => x)) { var types = (from t in assembly.GetLoadableTypes() where t.IsClass && t.IsPublic /* && typeof(ApiController).IsAssignableFrom(t)*/ && t.Namespace == namespaceName select t).OrderBy(x => x.Name).ToList(); // Generate the description for each type types.ForEach(this.GenerateDescription); } } private void GenerateDescription(Type type) { var httpConfiguration = new HttpConfiguration(); var apiControllerSelection = new ApiControllerActionSelector(); var apiDescriptor = new HttpControllerDescriptor(httpConfiguration, type.Name, type); ILookup<string, HttpActionDescriptor> apiMappings = apiControllerSelection.GetActionMapping(apiDescriptor); foreach (var maps in apiMappings) { foreach (HttpActionDescriptor httpActionDescriptor in maps) { this.GenerateDescription(httpActionDescriptor); } } } private void GenerateDescription(HttpActionDescriptor httpActionDescriptor) { // RelativePath ??? // Route Values ??? // Request Body ??? }
But how to get RelativePath (/api/controller/action/id?parameters), ad other information that ApiExplorer contains?
Thanks.