在我的 net core api 应用程序中,所有控制器都继承自基本控制器。
正因为如此,招摇是行不通的。
我使用 Visual Studio 创建了一个示例项目,并且 swagger 工作正常
但是当我创建一个继承自 ControllerBase 的基类 (Test.cs) 并将 ValuesController.cs 更改为继承自 Test 而不是 ControllerBase 时,swagger 不起作用。
我收到错误了
无法加载API定义。 获取错误未定义/swagger/v1/swagger.json
谢谢您的帮助!
这是我的代码:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "Test", Version = "v1" });
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.XML";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("swagger.json", "Test");
});
}
测试.cs
using Microsoft.AspNetCore.Mvc;
namespace WebApplication6.Controllers
{
public class Test : ControllerBase
{
public void MyTest()
{
}
}
}
ValuesController.cs
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication6.Controllers
{
[Route("api/[controller]")]
[ApiController]
// This works
// public class ValuesController : ControllerBase
// This doesn't works
public class ValuesController : Test
{
/// <summary>
/// Test
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
}
我认为最好使用 [NoAction] 告诉 Swagger Generator 这不是一个动作,不需要生成。示例如下。
[NonAction]
public OkObjectResult Ok(string message){}
我通过更改基类 Test.cs 解决了问题
public void MyTest()
到
protected void MyTest()
为了避免此问题并从 Swagger API 中排除控制器公共方法,您可以使用以下属性:
[ApiExplorerSettings(IgnoreApi = true)]
public void MyTest()
{
}