如何为以MVC为主的ASP.NET Core 7项目添加Swagger支持?
在混合MVC视图与API动作的控制器中配置Swagger支持
完全可以在这类混合控制器中配置Swagger支持,不用拆分API控制器到单独文件。核心思路是只让Swagger识别那些API专用的动作,同时不干扰MVC视图动作的正常运行,具体可以按以下步骤操作:
1. 调整Swagger服务注册逻辑
在Program.cs中注册Swagger服务时,添加文档包含筛选器,让Swagger只包含带有属性路由的动作(也就是你的API端点):
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "项目API", Version = "v1" }); // 只包含带有属性路由的动作,排除MVC约定路由的视图动作 c.DocInclusionPredicate((docName, apiDesc) => { return apiDesc.ActionDescriptor.AttributeRouteInfo != null; }); });
2. 为单个API动作添加必要特性
不用给整个控制器加[ApiController],只需给每个API动作单独添加属性路由和返回类型声明,比如:
public class HomeController : Controller { // MVC视图动作,保持原有写法不变 public IActionResult Index() { return View(); } // API动作:添加属性路由和JSON返回声明 [HttpGet("api/home/getdata")] [Produces("application/json")] public IActionResult GetData() { return Json(new { Code = 200, Data = "示例数据" }); } // POST类型的API动作:添加属性路由、接收JSON参数的声明 [HttpPost("api/home/savedata")] [Produces("application/json")] [Consumes("application/json")] public IActionResult SaveData([FromBody] UserInputModel model) { // 业务逻辑处理 return Ok(new { Success = true, Message = "保存成功" }); } }
3. 确保Swagger中间件正常启用
在Program.cs的管道配置中启用Swagger和SwaggerUI:
if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "项目API V1"); }); }
补充:强制标记API动作(可选)
如果有些API动作不想用属性路由(不推荐),可以给它们添加[ApiExplorerSettings(IgnoreApi = false)]特性,同时调整Swagger的筛选逻辑来识别这些动作:
// 不带属性路由的API动作,用特性标记让Swagger识别 [ApiExplorerSettings(IgnoreApi = false)] [Produces("application/json")] public IActionResult LegacyApi() { return Json(new { Message = "遗留API端点" }); }
对应的Swagger筛选器调整为:
c.DocInclusionPredicate((docName, apiDesc) => { // 包含带有属性路由,或者标记了ApiExplorerSettings(IgnoreApi=false)的动作 var apiSettings = apiDesc.ActionDescriptor.EndpointMetadata .OfType<ApiExplorerSettingsAttribute>() .FirstOrDefault(); return apiDesc.ActionDescriptor.AttributeRouteInfo != null || (apiSettings != null && !apiSettings.IgnoreApi); });
这样配置后,Swagger会自动识别并展示你的API端点,而MVC视图动作不会被纳入Swagger文档,也不会因为缺少属性路由报错。
内容的提问来源于stack exchange,提问作者AngryHacker
相关产品推荐
相关产品推荐

