NetCore Swagger 多版本

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 = "swagger@xxx.com", 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

 
 

 

posted @   Robot-Blog  阅读(308)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示