001 C#配置多个版本Swagger说明

发布时间 2023-08-02 21:05:54作者: 流浪のwolf

1. AddSwaggerGen

AddSwaggerGen 是配置多个版本的swagger的关键 

Path.Combine 当前项目运行的路径

UseSwaggerUI

主要分为 2 步骤  :

  1. 注册 Swagger 

  2. 使用 Swagger 

为了不让program.cs 文件夹内容过于冗余 复杂 我们把步骤  1和 2 写成扩展的方法  

program.cs 入口文件夹:

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using WebApplication1.Utility.SwaggerExt;

namespace WebApplication1
{
    public class Program
    {
        /// <summary>
        /// asdlfkasdio
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddControllers();
            // 注册 Swagger 
            CtmSwaggerExt.AddSwaggerExt(builder);

             var app = builder.Build();

            // IsDevelopment 是否是开发环境
            if (app.Environment.IsDevelopment())
            {
                CtmSwaggerExt.UseSwaggerExt(app);
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

 Utility 文件夹 用于存放扩展的方法 ;

ApiVersions.cs :

namespace WebApplication1.Utility.SwaggerExt
{
    /// <summary>
    /// Swagger的版本控制
    /// 使用枚举
    /// </summary>
    public enum ApiVersions
    {
        front_dev,
        after_admin
    }
}

CtmSwaggerExt.cs:

using Microsoft.OpenApi.Models;

namespace WebApplication1.Utility.SwaggerExt
{
    /// <summary>
    /// 自定义 Swagger扩展 
    /// 静态类中的静态方法
    /// 扩展的方法都是使用静态类中的静态方法???
    /// </summary>
    public static class CtmSwaggerExt
    {
        /// <summary>
        /// 注册 Swagger 的扩展方法
        ///  this 的作用是什么
        ///  builder 是 WebApplicationBuilder 的数据格式
        /// </summary>
        /// <param name="builder"></param>
        public static void AddSwaggerExt(this WebApplicationBuilder builder)
        {
            var arr = typeof(ApiVersions).GetEnumNames().ToList();
            builder.Services.AddEndpointsApiExplorer();
            // swagger 配置
            // 如果只要一个版本 builder.Services.AddSwaggerGen()即可
            // 多个版本要用 option 配置
            builder.Services.AddSwaggerGen(option =>
            {
                // 通过版本枚举循环展示不同版本的swagger项目
                Console.WriteLine("option开始配置多个swagger版本配置");
                // 1. 枚举类型的数据格式转换List格式
                arr.ForEach(version =>
                {
                    // ps 使用 OpenApiInfo 需要引入  using Microsoft.OpenApi.Models;
                    option.SwaggerDoc(version, new OpenApiInfo()
                    {
                        // 标题
                        Title = $"{version}===标题",
                        Version = $"{version}标注",
                        Description = $"版本说明 {version}"
                    });
                });
                // 2. 需要修改项目的属性 的生成 ==》 输出 ===》 文档文件 ==》 生成API文件 eg:  WebApplication1.xml 文件
                // 找到文档的绝对路径  xml 文件展示了控制器的注释内容[是要是文档注释都会显示的]
                var file = Path.Combine(AppContext.BaseDirectory, "WebApplication1.xml");
                Console.WriteLine(file);  // C:\Users\朱龙旭\Desktop\WebApplication1\WebApplication1\bin\Debug\net6.0\WebApplication1.xml
                // 显示控制器层注释
                option.IncludeXmlComments(file, true);
                // 对action 的名称进行排序,如果有多个,就可以看见效果了
                // option.OrderActionsBy(o => o.RelativePath);
            });

        }

        /// <summary>
        /// 使用 Swagger 的扩展方法 
        /// app 是 WebApplication 数据类型
        /// </summary>
        /// <param name="app"></param>
        public static void UseSwaggerExt(this WebApplication app)
        {
            var arr = typeof(ApiVersions).GetEnumNames().ToList();
            app.UseSwagger();
            app.UseSwaggerUI(option =>
            {
                foreach (string version in arr)
                {
                    // swagger.json 里面都是接口信息了
                    option.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"{version}");
                }
            });
        }
     
    }
}

控制器内容:

using Microsoft.AspNetCore.Mvc;
using WebApplication1.Utility.SwaggerExt;

namespace WebApplication1.Controllers
{
    /// <summary>
    /// 测试注释是否展示
    /// </summary>
    [ApiController]
    [Route("[controller]")]
    // 指定当前的控制器是哪个Swagger版本的  指定给 后台_version02
    [ApiExplorerSettings(IgnoreApi = false,GroupName = nameof(ApiVersions.after_admin))]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;
        /// <summary>
        /// DI
        /// </summary>
        /// <param name="logger"></param>
        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// GET方法
        /// </summary>
        /// <returns></returns>
        [HttpGet(Name = "GetWea阿斯顿rFoasasst")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
        
        /// <summary>
        /// POST方法
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IEnumerable<WeatherForecast> PostInfo()
        {
            // 随机生成 5 条对象数据 WeatherForecast 类型的
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                test = "adsfasd",
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

        /// <summary>
        /// PUT方法
        /// </summary>
        /// <returns></returns>
        [HttpPut]
        public IEnumerable<WeatherForecast> PutInfo()
        {
            // 随机生成 5 条对象数据 WeatherForecast 类型的
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                test = "adsfasd",
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
        /// <summary>
        /// DELETE方法
        /// </summary>
        /// <returns></returns>
        [HttpDelete]
        public IEnumerable<WeatherForecast> DeleteInfo()
        {
            // 随机生成 5 条对象数据 WeatherForecast 类型的
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                test = "adsfasd",
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}