一、前言
    现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人。没办法,我们只能去学习新的东西。一提到微服务,有一个绕不过的话题就是作为微服务的载体,WebAPI是离不开的。但是我们今天不讲WebAPI是什么,如何开发API,以及如何开发Restfull风格的API,我们聊另外一个话题,如何配置Swagger,让其支持多版本,并且支持参数、方法的注释说明。
    为什么我们会说这呢,因为,我们要开发API,就会涉及到别人如何使用你的API,相应的使用文档就少不了,当时当我们有了Swagger,就不一样了。Swagger会为我们提供这个文档的功能。
    我们今天开发的环境是:
            操作系统:Windows 10 Professional
            开发工具:Visual Studio 2022
            开发语言:C#
            开发平台:Asp.Net Core Web API 6.0。
            平台类型:跨平台。

二、我们开始配置Swagger,让其支持多版本和注释。
    在我们开始配置之前,先有一个直观的感受,我直接上一个截图。
    先来第一张截图,概况展示:
      

        再来一张,接口内部详情的:
      

    1、我们先设置一个版本信息的工具类,这个工具类可以放在单独的类库项目中,也可以放在 WebAPI 当前的项目中。        

 1 /// <summary>
2 /// 该类型定义了 WebAPI 版本的信息。
3 /// </summary>
4 public static class ApiVersionInfo
5 {
6 /// <summary>
7 /// 初始化默认值。
8 /// </summary>
9 static ApiVersionInfo()
10 {
11 V1 = string.Empty;
12 V2 = string.Empty;
13 V3 = string.Empty;
14 V4 = string.Empty;
15 }
16
17 /// <summary>
18 /// 获取或者设置 V1 版本。
19 /// </summary>
20 public static string V1;
21
22 /// <summary>
23 /// 获取或者设置 V2 版本。
24 /// </summary>
25 public static string V2;
26
27 /// <summary>
28 /// 获取或者设置 V3 版本。
29 /// </summary>
30 public static string V3;
31
32 /// <summary>
33 /// 获取或者设置 V4 版本。
34 /// </summary>
35 public static string V4;
36 }

    2、我们在 Program 里面配置 Swagger ,具体分为两个部分。

 1 using PatrickLiu.Net6.WebApiDetails.Extensions;
2 using System.Reflection;
3
4 var builder = WebApplication.CreateBuilder(args);
5
6 // Add services to the container.
7
8 builder.Services.AddControllers();
9 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
10 builder.Services.AddEndpointsApiExplorer();
11
12 #region 自定义配置Swagger
13
14 builder.Services.AddSwaggerGen(c =>
15 {
16 foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
17 {
18 c.SwaggerDoc(field.Name, new Microsoft.OpenApi.Models.OpenApiInfo()
19 {
20 Title = $"{field.Name}:这里是 PatrickLiu 教育",
21 Version = field.Name,
22 Description = $"当前的 ASP.Net Core Web API {field.Name} 版本"
23 });
24 }
25
26 #region 增加api读取注释
27
28 //获取应用程序所在目录(绝对不受工作目录影响,建议采用此方法获取路径)
29 string? basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
30
31 if (!string.IsNullOrEmpty(basePath) && !string.IsNullOrWhiteSpace(basePath))
32 {
33 string xmlPath = Path.Combine(basePath, "PatrickLiu.Net6.WebApiDetails.xml");
34 c.IncludeXmlComments(xmlPath);
35 }
36
37 #endregion
38 });
39
40 #endregion
41
42 #region 日志扩展
43
44 //builder.Logging.AddLog4Net("Config/log4net.config");
45
46 builder.Services.AddLogging(builder =>
47 {
48 builder.AddLog4Net("Config/log4net.config");
49 });
50
51 #endregion
52
53 var app = builder.Build();
54
55 #region Swagger 具体的配置
56
57 app.UseSwagger();
58 app.UseSwaggerUI(c =>
59 {
60 foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
61 {
62 c.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", $"{field.Name}");
63 }
64 });
65
66 #endregion
67
68 app.UseAuthorization();
69
70 app.MapControllers();
71
72 app.Run();

    3、我们建立我们自己的 APIController ,为每个 Controller 增加 [ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.版本号)) ],我就创建了2个Controller。

/// <summary>
/// 订单的服务控制器。
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName =nameof(ApiVersionInfo.V1))]
public class OrdersController : ControllerBase
{
/// <summary>
/// 获取数据列表。
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetAll")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} /// <summary>
/// 获取主键所对应的数据。
/// </summary>
/// <param name="id">查询的主键。</param>
/// <returns></returns>
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
} /// <summary>
/// 增加数据。
/// </summary>
/// <param name="value">参数</param>
[HttpPost]
public void Post([FromBody] string value)
{
} /// <summary>
/// 修改数据。
/// </summary>
/// <param name="id">查询主键。</param>
/// <param name="value">要修改的值。</param>
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
} /// <summary>
/// 删除数据。
/// </summary>
/// <param name="id">要删除的主键。</param>
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
 1 /// <summary>
2 ///
3 /// </summary>
4 [Route("v2/api/[controller]")]
5 [ApiController]
6 [ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.V2))]
7 public class OrdersV2Controller : ControllerBase
8 {
9 /// <summary>
10 /// 获取数据列表。
11 /// </summary>
12 /// <returns></returns>
13 [HttpGet]
14 public IEnumerable<string> Get()
15 {
16 return new string[] { "value1", "value2" };
17 }
18
19 /// <summary>
20 /// 获取主键所对应的数据。
21 /// </summary>
22 /// <param name="id">查询的主键。</param>
23 /// <returns></returns>
24 [HttpGet("{id}")]
25 public string Get(int id)
26 {
27 return "value";
28 }
29
30 /// <summary>
31 /// 增加数据。
32 /// </summary>
33 /// <param name="value">参数</param>
34 [HttpPost]
35 public void Post([FromBody] string value)
36 {
37 }
38
39 /// <summary>
40 /// 修改数据。
41 /// </summary>
42 /// <param name="id">查询主键。</param>
43 /// <param name="value">要修改的值。</param>
44 [HttpPut("{id}")]
45 public void Put(int id, [FromBody] string value)
46 {
47 }
48
49 /// <summary>
50 /// 删除数据。
51 /// </summary>
52 /// <param name="id">要删除的主键。</param>
53 [HttpDelete("{id}")]
54 public void Delete(int id)
55 {
56 }
57
58 /// <summary>
59 /// 增加一个人。
60 /// </summary>
61 /// <param name="person">要增加的人</param>
62 /// <param name="id">主键值。</param>
63 /// <param name="name">姓名。</param>
64 /// <param name="sex">性别</param>
65 /// <param name="address">地址。</param>
66 [HttpPost]
67 [Route("PutData")]
68 public void PutData(SinglePerson person,int id,string name,bool sex,string address)
69 {
70
71 }
72 }

    4、运行起来,看看效果吧。

      

三、结束语
    当我们的WebAPI有了新版本,我们也不用怕了,只要按我的设置,就可以灵活应付。不负苍天,继续努力。

如何在Net6.0里配置多版本支持并支持注释说明的Swagger的更多相关文章

  1. 在红帽RHEL7.0里配置网卡的四种方法

    第一种方法 :采用vim编辑器来配置: 1.  如下图的步骤所示: 2.  输入这个命令后进行配置成下方图片里的内容: 3.  然后退出vim 编辑器,然后重新启动一下网络服务配置: 4.这些配置完后 ...

  2. 如何在 Azure 虚拟机里配置条带化

    什么是条带化(striping) 条带 (strip) 是把连续的数据分割成相同大小的数据块,把每段数据分别写入到阵列中的不同磁盘上的方法.简单的说,条带是一种将多个磁盘驱动器合并为一个卷的方法. 许 ...

  3. Tomcat 6.0下配置HTTPS

    最近项目需要使用到https,所以回顾整理了一下,其实在tomcat的文档中已经有了详细描述,我们启动Tomcat后,可以在docs文档中找到 地址如下:http://localhost:8080/d ...

  4. Redis单机和集群配置(版本在5.0后)

    摘抄并用于自己后查 单机版的配置: 1. 下载redis压缩包,然后解压缩文件(tar xzf): 2. 进入解压后的redis文件目录,编译redis源文件(make,没有c环境要gcc): 3. ...

  5. phpstudy里升级mysql版本到5.7

    phpstudy里没有地方可以设置mysql数据库,很多人都疑惑在phpstudy里怎么升级mysql数据库版本,本文就教你如何在phpstudy中升级mysql的版本. PhpStudy集成环境中的 ...

  6. 在Android Studio和Android Eclipse 更改现有项目里的SDK版本

    一,在Eclipse下改项目里的SDK的版本方法有几种,都比较简单:1.右键单击项目--->properties---->Resource----->Android在Project ...

  7. JSP的那些事儿(2)---- DWR2.0 的配置和使用

    JSP的那些事儿(2)----DWR2.0 的配置和使用 分类: Web开发 JAVA 2009-04-23 15:43 999人阅读 评论(0) 收藏 举报 jspdwrjavascriptserv ...

  8. hadoop 2.0 详细配置教程(转载)

    转载: http://www.cnblogs.com/scotoma/archive/2012/09/18/2689902.html 作者:杨鑫奇 PS:文章有部分参考资料来自网上,并经过实践后写出, ...

  9. Json.Net6.0入门学习试水篇

    原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...

  10. Json.Net6.0

    Json.Net6.0入门学习试水篇   前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中表 ...

随机推荐

  1. WebApi如何启用Session并且使用

    首先打开项目的Global.asax文件,重新方法init public override void Init() { //注册事件 this.AuthenticateRequest += WebAp ...

  2. 云小课|云小课教您如何选择Redis实例类型

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:购买Redis实例 ...

  3. 2.6:Python数据存取-文件、文件夹及目录、数据库

    一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...

  4. 【离线数仓CDH版本】即席查询工具(Presto、Druid、Kylin)、CDH数仓、Impala查询

    1.即席查询 一.Presto 大数据量.秒级.多数据源的查询引擎[支持各种数据源work的内存级查询] 由coordinator和多个work构成,work对应不同数据源Catalog 特点:基于内 ...

  5. .NET 6 实现滑动验证码(四)、扩展类

    为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置.可自定义资源类型.自定义验证规则,本节创建一些扩展类,用来实现这些功能. 上一节内容:NET 6 实现滑动 ...

  6. Doris安装部署

    下载安装 Doris运行在Linux环境中,推荐 CentOS 7.x 或者 Ubuntu 16.04 以上版本,同时你需要安装 Java 运行环境(JDK最低版本要求是8) 1.下载安装包 下载地址 ...

  7. 跟我学Python图像处理丨带你入门OpenGL

    摘要:介绍Python和OpenGL的入门知识,包括安装.语法.基本图形绘制等. 本文分享自华为云社区<[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)>,作者:ea ...

  8. Mysql安装失败-GPG验证不通过或Failed to start mariadb.service: Unit not fou

    1.报错原因 报错原文 Key imported successfully Import of key(s) didn't help, wrong key(s)? Public key for mys ...

  9. 【Redis场景2】缓存更新策略(双写一致)

    在业务初始阶段,流量很少的情况下,通过直接操作数据是可行的操作,但是随着业务量的增长,用户的访问量也随之增加,在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力:所谓遇事不决,那就加一层. 在当前 ...

  10. opencv-python学习之旅

    opencv-python 操作 *注:在此笔记中只记录下各种函数的使用,规则 详细讲解见https://opencv.apachecn.org/#/docs/4.0.0/2.1-tutorial_p ...