不会为从基类继承的控制器生成 swagger.json

问题描述 投票:0回答:3

在我的 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" };
        }
    }
}
swagger asp.net-core-2.1
3个回答
1
投票

我认为最好使用 [NoAction] 告诉 Swagger Generator 这不是一个动作,不需要生成。示例如下。

 [NonAction]
 public OkObjectResult Ok(string message){}

1
投票

我通过更改基类 Test.cs 解决了问题

public void MyTest()

protected void MyTest()

0
投票

为了避免此问题并从 Swagger API 中排除控制器公共方法,您可以使用以下属性:

[ApiExplorerSettings(IgnoreApi = true)]
public void MyTest()
{
}
© www.soinside.com 2019 - 2024. All rights reserved.