替换控制器
1. 现有控制器
[Route("/api/account/test/a")] public class TestAController : PublicHealthBasicController { /// <summary> /// TestA /// </summary> /// <returns></returns> [HttpGet] public virtual string Get() { return "TestA"; } }
因为控制器 TestAController 是框架本身的代码所有无法修改源代码
这时候我们只需要在编写一个类来继承这个控制重写他的方法即可 但是重写的方法路由是不能重复的 所以我需要重新定义一个新的路由 代码如下
[Route("/api/account/test/b")] public class TestBController : TestAController { /// <summary> /// TestB /// </summary> /// <returns></returns> [HttpGet] public override string Get() { return "TestB"; } }
这时候因为线上代码正在运行的原因 所以调用的路由还是 /api/account/test/a 但是我们需要执行的逻辑也是 /api/account/test/b 这时候我们只需要添加一个中间件来处理一下即可
app.Use(async (context, next) => { var url = context.Request.Path.Value; if (url == "/api/account/test/a") { context.Request.Path = "/api/account/test/b"; } await next(); });
但是这时候我们的 Swagger 文档会看到2个接口的文档 /api/account/test/a /api/account/test/b
此时我们只希望只显示 /api/account/test/a 的文档 那我们就需要 屏蔽 /api/account/test/b的文档
options.DocInclusionPredicate((_, description) => description.RelativePath switch { _ when description.RelativePath.StartsWith("/api/account/test/b") => false, _ => true });