使Web API 2自主主机支持自动生成“API描述”页面

时间:2015-12-08 14:34:45

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

我最初使用VS2013向导创建了ASP.NET Web API 2,该向导默认使用IIS express托管,并且它有一个名为HomeController的默认控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Home Page";

        return View();
    }
}

通过以下网址和UI:

进行操作

enter image description here

点击 API 链接,该链接提供用于描述所有API控制器界面的摘要报告,然后用户开发人员知道如何调用这些API:

API report

后来,我试图将此项目切换为自托管,我基本上什么也没做,只是将项目类型更改为控制台并添加Program.cs,最后添加了一个新的SelfHostStartup.cs

public class SelfHostStartup
{
    // This code configures Web API. The Startup class is specified as a type
    // parameter in the WebApp.Start method.
    public void Configuration(IAppBuilder appBuilder)
    {
        // Configure Web API for self-host. 
        var config = new HttpConfiguration();
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        ConfigureAuth(appBuilder);

        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        // !possible! the HOME page route settings.
        RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        RouteTable.Routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { id = UrlParameter.Optional }
        );
        appBuilder.UseWebApi(config);
    }

运行Console程序后,所有API控制器都在浏览器中测试正常,但是再次使用这些URL进行测试

  • http://localhost:9000/home/index
     显示空白页
  • http://localhost:9000/api/home/index
  

     未找到与请求URI匹配的HTTP资源' http://localhost:9000/api/home/index'。         未找到与名为' home'的控制器匹配的类型。      

  • http://localhost:9000/home/
     显示空白页

我想这与html和js文件加载有关,似乎自主机模式没有加载这些文件?

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:0)

我做了一些工作来通过添加另一个控制器来实现类似的功能,并添加一个函数来列出所有已存在的API:

public class CloudApiParameter
{
    public string ParameterName { get; set; }
    public string ParameterType { get; set; }
}

public class CloudApiDescription
{
    public string Id { get; set; }
    public string RelativePath { get; set; }
    public string Document { get; set; }
    public IEnumerable<CloudApiParameter> Parameters { get; set; }

}

public IEnumerable<CloudApiDescription> Get()
{
    var apiDescs = Configuration.Services.GetApiExplorer().ApiDescriptions;
    return apiDescs.Select(r => new CloudApiDescription()
    {
        Id = r.GetFriendlyId(),
        RelativePath = r.RelativePath,
        Document = r.Documentation,
        Parameters = (r.ParameterDescriptions.Any() ? r.ParameterDescriptions.Select(p => new CloudApiParameter()
        {
            ParameterName = p.ParameterDescriptor.ParameterName,
            ParameterType = p.ParameterDescriptor.ParameterType.ToString()
        }): null)
    });
}