ASP.NET Core(.NET6)自定义Controller无法显示在Swagger的问题
问题描述
在ASP.NET Core(.NET6)项目中集成Swagger时,仅默认的WeatherForecast控制器能在Swagger界面中显示,自定义的HotelRoomController未被识别。已安装Swashbuckle.AspNetCore.Swagger、Swashbuckle.AspNetCore.SwaggerGen、Swashbuckle.AspNetCore.SwaggerUI包,期望该控制器调用HotelRoomRepository的方法并在Swagger中正常展示。
核心问题分析
查看提供的HotelRoomController代码,发现GetHotelRooms方法使用了private访问修饰符:
[HttpGet] private async Task<IActionResult> GetHotelRooms() { var allRooms = await _hotelRoomRepository.GetAllHotelRoom(); return Ok(allRooms); }
Swagger仅会扫描并展示控制器中public的Action方法,私有方法无法被Swagger的ApiExplorer组件识别,这是导致自定义控制器未显示的直接原因。
另外,当前控制器继承的是Controller,对于纯API场景,推荐继承ControllerBase(避免引入视图相关的冗余功能),但这并非Swagger不识别控制器的核心原因。
解决方案
将Action方法的访问修饰符改为public
修改GetHotelRooms方法的修饰符,确保Swagger能扫描到该接口:(可选但推荐)让API控制器继承ControllerBase
针对纯API控制器,继承ControllerBase更贴合场景,减少不必要的依赖。
修改后的HotelRoomController代码:
using Business.Repository.IRepository; using Microsoft.AspNetCore.Mvc; namespace HiddenVilla_API.Controllers { [Route("api/[controller]")] [ApiController] public class HotelRoomController : ControllerBase // 改为继承ControllerBase { private readonly IHotelRoomRepository _hotelRoomRepository; public HotelRoomController(IHotelRoomRepository hotelRoomRepository) { _hotelRoomRepository = hotelRoomRepository; } /// <summary> /// 获取所有酒店房间 /// </summary> /// <returns></returns> [HttpGet] public async Task<IActionResult> GetHotelRooms() // 改为public修饰符 { var allRooms = await _hotelRoomRepository.GetAllHotelRoom(); return Ok(allRooms); } } }
- 确认Swagger配置(当前配置已正确)
项目中的Swagger服务与中间件配置已满足要求:- 已添加
builder.Services.AddEndpointsApiExplorer();和builder.Services.AddSwaggerGen(...)服务注册 - 开发环境中已启用
app.UseSwagger()和app.UseSwaggerUI(...)中间件
这部分无需额外修改。
- 已添加
验证结果
修改完成后重启项目,访问Swagger页面(默认地址:https://localhost:<端口>/swagger),即可看到HotelRoomController及其GetHotelRooms接口正常展示。
内容的提问来源于stack exchange,提问作者RRuseva

