替换控制器

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
                    });

 

posted @ 2023-02-17 10:41  刘小吉  阅读(21)  评论(0编辑  收藏  举报