我从 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 中。
我错过了什么吗?
这是您在“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"
});
});
以下设置将有助于解决问题(这两个设置都是必需的):
Route
属性设置为 Controller
级别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 进行了测试