我有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
文档上看起来它应该无需任何修改即可使用
答案 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
}