菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

(C#)dotnet Core 在程序中获取 注释(summary)

6780人阅读 2023/7/25 19:10 总访问:958379 评论:0 收藏:0 手机
分类: Csharp

前言

 有个比较怪的需求,就是把我现在所有能够访问的接口都展示出来

比如我有一个 home 的控制器,我需要将此控制器的提供的接口获取到,成为一个List,然后还要获取到接口的注释一并返回

像这样

                           api:  api/home/index
                 summary: 首页接口
                controller: home
controllerSummary: 首页控制器

但是summary在编译时是不会被编译的,所以获取到这个比较困难

具体解决方法如下

生成注释的XML文档

 右键项目,点击属性,新建一个xml 文件用于存放 注释信息(与swagger 获取注释信息一样的)


生成项目后就能看到,所有注释都被放在了这个文件中

获取所有的API 列表

使用 此接口  IActionDescriptorCollectionProvider

  1.      private IActionDescriptorCollectionProvider _actionProvider;
  2.         public ResService(IActionDescriptorCollectionProvider actionProvider)
  3.         { 
  4.             _actionProvider = actionProvider;
  5.         }
  6.         
  7.           public async Task<dynamicGetPortResListAsync()
  8.         {
  9.             var list = new List<Dictionary<stringobject>>();
  10.             //获取所有的api 接口
  11.             var actionDescs = _actionProvider.ActionDescriptors.Items.Cast<ControllerActionDescriptor>().Select(x => new
  12.             {
  13.                 DisplayName = x.DisplayName.TrimEnd("(NK.WebApi)".ToCharArray()).Trim(), //这里是跟XML文件做匹配的关键字段,需要将末尾括号里的内容移除掉
  14.                 RouteTemplate = x.AttributeRouteInfo.Template,//接口名称
  15.                 Controller = x.ControllerName,//控制器名
  16.                 ContrillereFullName = x.ControllerTypeInfo.FullName//控制器全路径
  17.             }).ToList();
  18.             // 指定 XML 文件路径
  19.             string filePath = "./NK.WebApi.xml";
  20.             try
  21.             {
  22.                 // 创建 XmlReaderSettings 对象并禁用 DTD 处理(可选)
  23.                 var readerSettings = new XmlReaderSettings
  24.                 {
  25.                     DtdProcessing = DtdProcessing.Ignore
  26.                 };
  27.                 // 使用 XmlReader 加载 XML 文件
  28.                 using (XmlReader xmlReader = XmlReader.Create(filePath, readerSettings))
  29.                 {
  30.                     // 创建 XmlDocument 对象并加载 XML 数据
  31.                     var xmlDoc = new XmlDocument();
  32.                     xmlDoc.Load(xmlReader);
  33.                     //获取所有的注释信息
  34.                     var xmlItem = xmlDoc.ChildNodes.Item(1).ChildNodes.Item(1).ChildNodes;
  35.                     //循环所有接口
  36.                     foreach (var node in actionDescs)
  37.                     {
  38.                         Dictionary<stringobject> data = new Dictionary<stringobject>();
  39.                         XmlNode ApiNode = null;
  40.                         string summary = string.Empty;//接口注释
  41.                         string controllerSummary =string.Empty;//控制器注释
  42.                         foreach (XmlNode xmlNode in xmlItem)
  43.                         {
  44.                             //拿到XML 中 匹配字段的属性
  45.                             var tempName = xmlNode.Attributes[0].InnerText.TrimStart("M:".ToCharArray()).TrimStart("P:".ToCharArray()).TrimStart("T:".ToCharArray());
  46.                             //去除末尾括号以及括号中的内容
  47.                             tempName = Regex.Replace(tempName, @"\([^()]*\)$""");
  48.                             if (node.DisplayName== tempName)
  49.                             {
  50.                                 //匹配成功后,获取对应的注释信息
  51.                                 summary = xmlNode.ChildNodes.Item(0).InnerText.Trim();
  52.                                 ApiNode = xmlNode;
  53.                                 break;
  54.                             }
  55.                         }
  56.                         //获取控制器的注释
  57.                         foreach (XmlNode xmlNode in xmlItem)
  58.                         {
  59.                             //拿到XML 中 匹配字段的属性
  60.                             var tempName = xmlNode.Attributes[0].InnerText.TrimStart("M:".ToCharArray()).TrimStart("P:".ToCharArray()).TrimStart("T:".ToCharArray());
  61.                             //去除末尾括号以及括号中的内容
  62.                             tempName = Regex.Replace(tempName, @"\([^()]*\)$""");
  63.                              //与控制器的fullName 做匹配
  64.                             if (node.ContrillereFullName == tempName)
  65.                             {
  66.                                  //匹配成功后,获取对应的注释信息
  67.                                 controllerSummary = xmlNode.ChildNodes.Item(0).InnerText.Trim();
  68.                                 break;
  69.                             }
  70.                         } 
  71.                         //成功匹配则加入列表并返回
  72.                         if (!ApiNode.IsNullOrEmpty())
  73.                         {
  74.                             data.Add("API", node.RouteTemplate);
  75.                             data.Add("Summary", summary);
  76.                             data.Add("Controller", node.Controller);
  77.                             data.Add("ControllerSummary", controllerSummary);
  78.                             list.Add(data);
  79.                         } 
  80.                     }  
  81.                 }
  82.             }
  83.             catch (Exception ex)
  84.             {
  85.                 Console.WriteLine($"XML 加载错误:{ex.Message}");
  86.             }
  87.             return list;
  88.         }

返回的数据就是这样的,注释变了之后,此接口的数据也会及时变







































评价

vs注释失效,提示xml注释没有放到有效得元素上,造成swagger生成注释也失效

vs注释失效,提示xml注释没有放到有效得元素上,造成swagger生成注释也失效。原因很简单.....方法上面还有一个默认的生成没...

ABP Xml为Swagger接口页添加详细注释

我们选中我们Application层的项目,右键“属性”,勾选为Xml生成文档,如下图所示。在你的 项目名.Web.Host 的startup目录...

pyton注释、变量、数据类型、变量缓存、类型转换

#变量的声明 #方法1 a=1 b=2 print(a) print(b) #方法2 c,d=3,4 print(c,d) #变量的命名 #字母数字下划线,首字...

mysql创建表,mysql 创表,注释,默认值。mysql添加列命令mysql添加字段。创表的常用字段。删除列

MySql常用 DDL命令 [TOC]创建表语句Create Table Users ( Id int, UserName varchar(64), Age int, Gender...

Swashbuckle Swagger添加注释

项目右键—&gt;属性—&gt;生成。勾上xml文档文件,它会生成基于xml的注释:勾上:XML文档文件(X)然后添加代码,去读取这个生...

mysql创表,mysql创表添加注释

简单的创表,配合一点约束 create table employee ( id int PRIMARY key auto_increment, name varchar(10) not ...

shell注释 03

一、shell注释1、单行注释以#开头例如#!/bin/bash#这是临时shell脚本echo &#39;nihao&#39;2、多行注释以 :&lt;&lt;字符 开...

netcor6.0 swargger 生成带注释的api

目录 api带有中文注释和字段解释 program项目配置 api带有中文注释和字段解释programbuilder.Services.AddSwaggerGe...

mysql 使用命令添加列,包含类型,注释,默认值等

代码如下: ALTER TABLE training_subprogram ADD COLUMN IsMustDo TINYINT DEFAULT 0 COMMENT &#39;是否必做(用于公开...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...