.NET 8独立进程Azure Function调整Swagger路径移除/api前缀
解决方案
一、调整Swagger中间件的路由前缀
在Program.cs里配置Swagger时,直接指定路由前缀为docs,让Swagger相关路径脱离/api前缀:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "领域API", Version = "v1" }); }); builder.Services.AddEndpointsApiExplorer(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(c => { // 将Swagger的路由前缀设为"docs",替代默认的"api" c.RoutePrefix = "docs"; }); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/docs/swagger.json", "领域API V1"); }); }
二、给Function路由添加参数约束
为了彻底避免/api/swagger.json被当成{Id}参数解析,在Function的路由上给id添加类型约束(比如int或Guid),只有符合类型格式的路径才会触发该Function:
示例(int类型Id):
[FunctionName("GetDomainItem")] public IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "api/{id:int}")] HttpRequest req, int id, ILogger log) { // 业务逻辑实现 return new OkObjectResult($"获取到ID为{id}的领域数据"); }
示例(Guid类型Id):
[FunctionName("GetDomainItem")] public IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "api/{id:guid}")] HttpRequest req, Guid id, ILogger log) { // 业务逻辑实现 return new OkObjectResult($"获取到ID为{id}的领域数据"); }
三、验证效果
配置完成后启动服务:
GET /Api/123(或对应Guid格式的ID):正常触发Function并返回数据GET /Docs/Swagger.json:可以正常获取Swagger文档GET /api/swagger.json:会返回404,因为路由约束不匹配,不会进入Function处理,也就不会出现参数转换错误
补充说明
你之前配置OpenApiServer的方式只修改了Swagger文档中声明的服务器地址,并没有改变Swagger本身的路由路径,所以解决不了前缀冲突问题。而通过上述两步配置,既能保留原有API的路由设计,又能让Swagger文档路径独立出来。
内容的提问来源于stack exchange,提问作者ruffen
相关产品推荐
相关产品推荐

