Swashbuckle没有看到我的任何控制器

时间:2018-03-20 15:56:14

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

我有ASP MVC 5项目,我已经添加了Web Api。现在我尝试安装Swashbuckle(来自bootstrap) - 但它只显示一个没有任何控制器的空文档。

我的控制器:

 [RoutePrefix("api/v1/Test/Check")]
    public class TestController : ApiController
    {
        // GET: api/Test
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET: api/Test/5
        [HttpGet]
        public string Get(int id)
        {
            return "value";
        }

        // POST: api/Test
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/Test/5
        [HttpPut]
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/Test/5
        [HttpDelete]
        public void Delete(int id)
        {
        }

        // GET: api/Test
        [Route("GetMetadata")]
        [HttpGet]
        public IEnumerable<string> GetMetadata()
        {
            return new string[] { "value2221", "value2" };
        }
    }

我的网络Api配置:

  configuration.MapHttpAttributeRoutes();

  configuration.Routes.MapHttpRoute("Public API V1", "api/v1/{controller}/{id}",
                new { id = RouteParameter.Optional });

我的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            //WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }

Swashbuckle配置是默认配置。

生成的swagger文档如下所示:

{
  swagger: "2.0",
  info: {
    version: "v1",
    title: "WebServer"
  },
  host: "localhost:55309",
  schemes: [
    "http"
  ],
  paths: { },
  definitions: { }
}

我可以在http://localhost:55309/api/v1/Test

上访问我的控制器

我不确定是否需要更改生成的SwaggerConfig.cs中的任何内容,但仔细查看它并在swashbuckle文档上看起来它应该无需任何修改即可使用

2 个答案:

答案 0 :(得分:1)

好的,我想我已经做到了。我必须下载swashbuckle来源并进行调试,但这是值得的。

原来问题不在于swashbuckle本身,而在ApiExplorer由于某种原因导致.ApiDescriptions为空。

在我的调试过程中,我已将这两行放在Application_Start()的末尾,即使这些行没有做任何事情,但魔法发生了,它开始起作用了:

var explorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
var descriptions = explorer.ApiDescriptions;

然后我进一步发现了这个主题:ASP.Net Web API Help Page Area returning empty output(参见第一个答案) 我正在使用Glimpse,虽然我实际安装它是为了解决swashbuckle问题! (我认为这可能有所帮助 - 但事实并非如此,但是Glimpse觉得这是一个很好的工具,所以我把它留在了那里)

正如第一个答案所示,我已用此修改了web.config

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
<inspectors>
   <ignoredTypes>
      <add type="Glimpse.AspNet.Inspector.RoutesInspector, Glimpse.AspNet"/>
   </ignoredTypes>
</inspectors>
</glimpse>

并从Application_Start()删除了两行,因为这些不是修复。它开始起作用了!

说实话,我不知道那里发生了什么。我清楚地记得在我开始使用Glimpse之前它没有工作,所以安装一瞥并修复问题并不能解决原始问题,但我真的厌倦了这个问题,我准备像这样关闭它。

希望这有助于某人。

P.S。只是警告那些试图调试类似问题的人。我的另一个错误是我在尝试之间没有关闭IIS Express。它实际上使应用程序保持运行,因此即使您在VS中启动/停止应用程序,也不会重新应用配置。如果您使用配置 - 您需要在尝试之间关闭ISS Express。

答案 1 :(得分:0)

我的web api项目遇到了同样的问题,我用这种方式解决了这个问题:

1)首先,我创建了以下扩展方法:

 public static class SwaggerExtensions
{
    public static HttpConfiguration EnableSwagger(this HttpConfiguration httpConfiguration)
    {
        httpConfiguration
            .EnableSwagger(c => c.SingleApiVersion("v1", "WebApi"))
            .EnableSwaggerUi();
        return httpConfiguration;
    }
}

2)然后在Startup类中:

 public void Configuration(IAppBuilder app)
    {

        var config = new HttpConfiguration();

        config.EnableSwagger();
        var webApiConfiguration = WebApiConfig.Register(config);

        //here I commented other startup code

    }