在 aspnetboilerplate 中将 API 控制器添加到我的主机项目时,Swagger 中断了

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

我从 https://aspnetboilerplate.com/Templates 下载了一个新的 .Net Core MVC 项目模板,设置了所有内容(数据库和恢复的 nuget 包)并运行了 Host 应用程序。一切都很好,因为我启动了 Swagger UI 并且可以看到所有标准服务。

然后我继续在主机应用程序中创建一个简单的 API 控制器:

[Route("api/[controller]")]
[ApiController]
public class FooBarController : MyAppControllerBase
{
    public string HelloWorld()
    {
        return"Hello, World!";
    }
}

然后 Swagger 无法加载 API 定义:

Fetch error
Internal Server Error http://localhost:21021/swagger/v1/swagger.json

如果我删除

Route
ApiController
属性,Swagger 会再次工作,但不会显示我的新控制器。我可以通过转到
http://localhost:21021/foobar/helloworld
来访问它,这可能没问题,但我希望它显示在 Swagger UI 中。

我错过了什么吗?

swagger abp
2个回答
0
投票

这是您在“Configure(IApplicationBuilder app, IHostingEnvironment env)”方法中配置 Swagger 的方式。

#region Swagger COnfiguration
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("swagger/v1/swagger.json", "Your class name");
    c.RoutePrefix = string.Empty;
});
#endregion

这里是 swagger 的 configureServices 设置。

services.AddSwaggerGen(config =>
{
    config.SwaggerDoc("v1", new Info
    {
        Title = "Title Here",
        Version = "v1"
    });
});

0
投票

以下设置将有助于解决问题(这两个设置都是必需的):

  1. Route
    属性设置为
    Controller
    级别
  2. Route
    属性设置为
    Action
    级别

这将有助于

app.MapControllers()
当存在使用相同 Http 动词的操作时解析路由。

示例代码截图如下:

服务和应用程序所需的调用如下:

// calls on the IServiceCollection
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// calls on the app object
app.UseSwagger();
app.UseSwaggerUI();

注意:我已经在 VS 2022 上使用 .Net 8 进行了测试

© www.soinside.com 2019 - 2024. All rights reserved.