首页 > 其他分享 >NetCore Swagger 多版本

NetCore Swagger 多版本

时间:2022-09-23 17:58:14浏览次数:65  
标签:Swagger apiName NetCore version 版本 var swagger public 路由

1.版本枚举

    /// <summary>
    /// swagger 多版本枚举
    /// </summary>
    public enum SwaggerVersionEnum
    {
        /// <summary>
        /// V1 版本,复杂情况可通过特性获取
        /// </summary>
        [Description("V1.000")]
        V1 = 1000,
        /// <summary>
        /// V2 版本,复杂情况可通过特性获取
        /// </summary>
        [Description("V2.000")]
        V2 = 2000,
        /// <summary>
        /// V2 版本,复杂情况可通过特性获取
        /// </summary>
        [Description("V3.000")]
        V3 = 3000,
    }

2.自定义特性,重写路由

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using System;

    /// <summary>
    /// 自定义路由 /api/{version}/[controler]/[action]
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class SwaggerVersionAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
    {
        /// <summary>
        /// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider
        /// </summary>
        public string GroupName { get; set; }

        /// <summary>
        /// 自定义路由构造函数,继承基类路由
        /// </summary>
        /// <param name="actionName"></param>
        public SwaggerVersionAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName)
        {
        }
        /// <summary>
        /// 自定义版本+路由构造函数,继承基类路由
        /// </summary>
        /// <param name="actionName"></param>
        /// <param name="version"></param>
        public SwaggerVersionAttribute(SwaggerVersionEnum version, string actionName = "[action]") : base($"/api/{version.GetDescription()}/[controller]/{actionName}")
        {
            GroupName = version.GetDescription();
        }
    }

3.接口使用特性

        /// <summary>
        /// add2
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost, SwaggerVersion(SwaggerVersionEnum.V2, "add")]
        public async Task<int> V2_Add([FromBody] ProductDto dto)
        {
            await Task.Run(() => { });
            return 1;
        }

5.修改swagger配置

        /// <summary>
        /// 添加服务: swagger
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static void AddCustSwagger(this IServiceCollection services)
        {
            var version = "V1.0";
            var apiName = "XXX系统";
            //  swagger多版本配置
            var basePath = Directory.GetCurrentDirectory();
            services.AddSwaggerGen(c =>
            {
                //var versionList = typeof(SwaggerVersionEnum).GetEnumNames();
                var versionList = EnumExtend.GetEnumList<SwaggerVersionEnum>().Select(x => x.Description);
                versionList.ToList().ForEach(version =>
                {
                    c.SwaggerDoc(version, new OpenApiInfo//"V1"
                    {
                        Version = version,
                        Title = $"{apiName} 接口文档",
                        Description = $"{apiName} HTTP API {version}",
                        //Contact = new OpenApiContact { Name = apiName, Email = "[email protected]", Url = new Uri("https://www.cnblogs.com/CRobot/") },
                        //License = new OpenApiLicense { Name = apiName, Url = new Uri("https://www.cnblogs.com/CRobot/") }
                    });
                    c.OrderActionsBy(o => o.RelativePath);

                    //  获取应用程序xml所在目录
                    var xmlPath = Path.Combine(basePath, "ProjectName.xml");
                    //  swagger界面默认只显示 方法&字段 注释,不显示 控制器注释
                    //  第二个参数为true, 则是controller的注释
                    c.IncludeXmlComments(xmlPath, true);
                });
            });
        }

        /// <summary>
        /// 添加中间件: swagger
        /// </summary>
        /// <param name="app"></param>
        public static void UseCustSwagger(this IApplicationBuilder app)
        {
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                //  swagger多版本配置
                var apiName = "XXX系统";
                //根据版本名称倒序 遍历展示
                //var versionList = typeof(SwaggerVersionEnum).GetEnumNames();
                var versionList = EnumExtend.GetEnumList<SwaggerVersionEnum>().Select(x => x.Description);
                versionList.OrderByDescending(e => e).ToList().ForEach(version =>
                {
                    options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"{apiName} {version}");
                });
                //  默认路径为:/swagger/index.html
                //  路由前缀 - 设置为空,可直接跳转到swagger页面:/index.html
                //  api测试可设置为空,部署时容易与前端路由冲突
                options.RoutePrefix = string.Empty;
            });
        }

 

Reference:

NetCore 配置Swagger

   

 

标签:Swagger,apiName,NetCore,version,版本,var,swagger,public,路由
From: https://www.cnblogs.com/CRobot/p/16723587.html

相关文章

  • SOUI4新版本的日志系统介绍
    原来的日志输出宏用法有点奇怪,感觉总是不够理想。这近有点时间终于把它重整了一下。以前的用法就不介绍了,重点介绍一下新版本的用法。在SOUI中使用的日志系统包含两个部......
  • IDEA 中jdk版本切换
    IDEA中jdk版本切换idea中引入的jdk版本是11,由于11中有些包和8中有区别,需要切换回jdk8在settings中修改  在projectStructrue中修改 ......
  • 第九章Centos7下Docker版本升级
    一、查找Docker的软件包[root@staging~]#rpm-qa|grepdockerdocker-client-1.13.1-203.git0be3e21.el7.centos.x86_64docker-common-1.13.1-203.git0be3e21.el7.ce......
  • 微服务系列之Api文档 swagger整合
    1.前言微服务架构随之而来的前后端彻底分离,且服务众多,无论是前后端对接亦或是产品、运营翻看,一个现代化、规范化、可视化、可尝试的文档是多么重要,所以我们这节就说说......
  • 查看linux系统版本
    参考:https://blog.csdn.net/majianting/article/details/122694130https://blog.csdn.net/GSWWJM/article/details/119727346?spm=1001.2101.3001.6650.2&utm_medium=dis......
  • centos7 解决libstdc++.so.6.0.19版本问题
    问题描述:ImportError:/usr/lib64/libstdc++.so.6:version`CXXABI_1.3.8’notfound查看:[root@localhostlib64]#find/-namelibstdc++.so.6/usr/lib64/libstdc......
  • k8s--使用 kubeadm 搭建 k8s 1.25.2 版本
    前戏ip描述 10.6.215.30master1 10.6.215.31master2 10.6.215.32node1 10.6.215.33node2给四台主机分别设置hostname,后面会根据hostna......
  • kubesphere 使用遇到的坑 (3.20版本)
    流水线构建拉取代码使用ssh拉取代码时需要带上私钥,不是简单的复制就可以,需要添加前缀ssh://(git地址和私钥都需要添加)建议使用http拉取用账户名密码登陆部署代码......
  • .NET6 下的 WebApi版本控制
    1.创建普通WebApi项目删除自带的Controller控制器2.引入Api版本控制的服务3.在Controller文件夹下建立两个子文件V1和V2并分别建立两个Controller控制器如图所......
  • CAP事件总线在NetCore中的应用
    在前面的文章中,我们介绍过Abp自带的本地事件总线,但它有几点不足1:缺乏失败重试机制,即若发布事件失败或者订阅事件处理失败,他没有重试机制,导致业务和数据异常。2:缺乏对存......