ApiExplorer用于外部装配中的WebAPI控制器

时间:2015-09-08 16:05:44

标签: c# asp.net-web-api asp.net-mvc-apiexplorer

我的WebApi控制器位于程序集(自托管OWIN应用程序或ASP MVC应用程序)中。 是否可以使用ApiExplorer形成另一个应用程序(动态加载带有WebApi控制器的程序集)来生成Web API文档?

1 个答案:

答案 0 :(得分:0)

ApiExplorer使用GlobalConfiguration确定可用的ApiControllers。指定外部程序集时,通常通过替换WebApi正在使用的IAssemblyResolver来执行此操作。这可以在Application_Start中完成,如下所示:

  protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        UnityConfig.RegisterComponents();

        GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssemblyResolver());

        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }

这是AssemblyResolver的实现:

public class AssemblyResolver : System.Web.Http.Dispatcher.DefaultAssembliesResolver
    {
        public override ICollection<Assembly> GetAssemblies()
        {
            ICollection<Assembly> baseAssemblies = base.GetAssemblies();
            List<Assembly> assemblies = new List<Assembly>(baseAssemblies);

            var externalAssembly = typeof(MyApp.External).Assembly;
            assemblies.Add(externalAssembly);

            return baseAssemblies;
        }
    }

有人可能认为这足以让ApiExplorer接受它,但事实并非如此。当ApiExplorer启动时,GlobalConfiguration将传递给HelpController。如果仔细查看GlobalConfiguration实例,您将看到Application_Start中受影响的更改不存在。因此,要让ApiExplorer选择你的外部类,你可以像这样更新IAssemblyResolver:

public HelpController(HttpConfiguration config)
    {
        GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssemblyResolver());

        Configuration = config;
    }

可能有一种更干净的方法,所以你不要打破DRY - 但还没有找到它。我发现它会更新这篇文章。