翼度科技»论坛 编程开发 .net 查看内容

.NET Core Api获取所有Action以及注释内容

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
有个项目需要获取项目内所有Action,并在凌晨定时任务跑完所有接口检查是否有接口报错,写了如下方法:
  1.         /// <summary>
  2.         /// 获取Action注释
  3.         /// </summary>
  4.         /// <param name="root"></param>
  5.         /// <param name="method">方法</param>
  6.         /// <param name="xmlPath">项目xml路径</param>
  7.         /// <returns></returns>
  8.         static string? GetMethodSummary(XmlElement root, MethodInfo method, string xmlPath)
  9.         {
  10.             // 查找方法的注释节点
  11.             string memberName = GetMethodSignature(method);
  12.             XmlNode? memberNode = root.SelectSingleNode($"//member[@name='{memberName}']");
  13.             // 获取方法的 <summary> 注释
  14.             XmlNode? summaryNode = memberNode?.SelectSingleNode("summary");
  15.             string? summary = summaryNode?.InnerText.Trim();
  16.             return summary;
  17.         }
复制代码
  1.         /// <summary>
  2.         /// 获取控制器注释
  3.         /// </summary>
  4.         /// <param name="root"></param>
  5.         /// <param name="controllerType">控制器</param>
  6.         /// <param name="xmlPath">项目xlm路径</param>
  7.         /// <returns></returns>
  8.         static string? GetMemberSummary(XmlElement root, Type controllerType, string xmlPath)
  9.         {
  10.             // 查找方法的注释节点
  11.             string memberName = $"T:{controllerType.FullName}";
  12.             XmlNode? memberNode = root.SelectSingleNode($"//member[@name='{memberName}']");
  13.             // 获取方法的 <summary> 注释
  14.             XmlNode? summaryNode = memberNode?.SelectSingleNode("summary");
  15.             string? summary = summaryNode?.InnerText.Trim();
  16.             return summary;
  17.         }
复制代码
  1.         /// <summary>
  2.         /// 获取方法签名
  3.         /// </summary>
  4.         /// <param name="methodInfo"></param>
  5.         /// <returns></returns>
  6.         static string GetMethodSignature(MethodInfo methodInfo)
  7.         {
  8.             StringBuilder signatureBuilder = new StringBuilder();
  9.             signatureBuilder.Append($"M:{methodInfo.DeclaringType!.FullName}.{methodInfo.Name}");
  10.             ParameterInfo[] parameters = methodInfo.GetParameters();
  11.             if (parameters.Length > 0)
  12.             {
  13.                 signatureBuilder.Append("(");
  14.                 for (int i = 0; i < parameters.Length; i++)
  15.                 {
  16.                     ParameterInfo parameter = parameters[i];
  17.                     // 判断是否为泛型类型
  18.                     if (parameter.ParameterType.IsGenericType)
  19.                     {
  20.                         Type genericTypeDefinition = parameter.ParameterType.GetGenericTypeDefinition();
  21.                         Type[] genericArguments = parameter.ParameterType.GetGenericArguments();
  22.                         string typeName = $"{genericTypeDefinition.FullName!.Remove(genericTypeDefinition.FullName.IndexOf('`'))}{{";
  23.                         for (int j = 0; j < genericArguments.Length; j++)
  24.                         {
  25.                             typeName += $"{genericArguments[j].FullName},";
  26.                         }
  27.                         typeName = typeName.TrimEnd(',') + "}";
  28.                         signatureBuilder.Append(typeName);
  29.                     }
  30.                     else
  31.                     {
  32.                         signatureBuilder.Append(parameter.ParameterType.FullName);
  33.                     }
  34.                     if (i < parameters.Length - 1)
  35.                     {
  36.                         signatureBuilder.Append(",");
  37.                     }
  38.                 }
  39.                 signatureBuilder.Append(")");
  40.             }
  41.             return signatureBuilder.ToString();
  42.         }
复制代码
实体类:
  1. ublic class Themeinterface
  2. {
  3.     /// <summary>
  4.     /// 方法
  5.     /// </summary>
  6.     [Description("方法")]
  7.     [StringLength(50)]
  8.     [Column("Action")]
  9.     public string Action { get; set; }
  10.     /// <summary>
  11.     /// 方法特性
  12.     /// </summary>
  13.     [Description("方法特性")]
  14.     [Column("ActionAttributes")]
  15.     public string? ActionAttributes { get; set; }
  16.     /// <summary>
  17.     /// 方法名称
  18.     /// </summary>
  19.     [Description("方法名称")]
  20.     [Column("ActionName")]
  21.     public string? ActionName { get; set; }
  22.     /// <summary>
  23.     /// 方法参数
  24.     /// </summary>
  25.     [Description("方法参数")]
  26.     [Column("ActionParams")]
  27.     public string? ActionParams { get; set; }
  28.     /// <summary>
  29.     /// 控制器
  30.     /// </summary>
  31.     [Description("控制器")]
  32.     [StringLength(255)]
  33.     [Column("Controller")]
  34.     public string Controller { get; set; }
  35.     /// <summary>
  36.     /// 控制器名称
  37.     /// </summary>
  38.     [Description("控制器名称")]
  39.     [Column("ControllerName")]
  40.     public string? ControllerName { get; set; }
  41.     [Key]
  42.     [Column("Id")]
  43.     public int Id { get; set; }
  44.     /// <summary>
  45.     /// 调用时间
  46.     /// </summary>
  47.     [Description("调用时间")]
  48.     [Column("InvokeTime")]
  49.     public int? InvokeTime { get; set; }
  50.     /// <summary>
  51.     /// 执行状态
  52.     /// </summary>
  53.     public string Status { get; set; }
  54.     /// <summary>
  55.     ///
  56.     /// </summary>
  57.     public int StatusCode { get; set; }
  58.     /// <summary>
  59.     /// 请求方法
  60.     /// </summary>
  61.     public string? Method { get; set; }
  62.     /// <summary>
  63.     ///
  64.     /// </summary>
  65.     public string? IP { get; set; }
  66.     /// <summary>
  67.     /// 异常
  68.     /// </summary>
  69.     public string? Exception { get; set; }
  70.     /// <summary>
  71.     /// 请求路径
  72.     /// </summary>
  73.     public string? Path { get; set; }
  74.     /// <summary>
  75.     /// 请求参数
  76.     /// </summary>
  77.     public string? QueryString { get; set; }
  78.     /// <summary>
  79.     ///
  80.     /// </summary>
  81.     public DateTime? CreateTime { get; set; }
  82.     /// <summary>
  83.     ///
  84.     /// </summary>
  85.     public DateTime? UpdateTime { get; set; }
  86. }
复制代码
使用:
  1.         /// <summary>
  2.         /// 获取所有接口
  3.         /// </summary>
  4.         /// <returns></returns>
  5.         public static List<Themeinterface> GetAllInterface()
  6.         {
  7.             // 获取方法的 XML 文档路径
  8.             string xmlPath = Assembly.GetExecutingAssembly().Location.Replace("dll", "xml");
  9.             XmlDocument xmlDoc = new XmlDocument();
  10.             xmlDoc.Load(xmlPath);
  11.             XmlElement root = xmlDoc.DocumentElement!;
  12.             var childControllers = Assembly.GetExecutingAssembly()
  13.             .GetTypes()
  14.             .Where(t => t.IsSubclassOf(typeof(BaseController)) && t != typeof(BaseController) && !t.IsDefined(typeof(IgnoreInterfaceAttribute)))
  15.             .ToList();
  16.             List<Themeinterface> themeinterfaces = new();
  17.             foreach (var controllerType in childControllers)
  18.             {
  19.                 var actions = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
  20.                     .Where(m => (typeof(IActionResult).IsAssignableFrom(m.ReturnType) || typeof(Task<IActionResult>).IsAssignableFrom(m.ReturnType))
  21.                     && m.DeclaringType == controllerType && !m.IsDefined(typeof(IgnoreInterfaceAttribute)))
  22.                     .Select(m => new
  23.                     {
  24.                         ActionName = m.Name,
  25.                         Parameters = m.GetParameters()
  26.                             .Select(p => new
  27.                             {
  28.                                 Name = p.Name,
  29.                                 Type = p.ParameterType.FullName,
  30.                                 Attributes = p.GetCustomAttributes().Select(attr => attr.GetType().Name).ToList()
  31.                             })
  32.                             .ToList(),
  33.                         ActionSummary = GetMethodSummary(root, m, xmlPath),
  34.                         Method = m.GetCustomAttributes(typeof(HttpPostAttribute), false).Cast<HttpPostAttribute>().FirstOrDefault() == null ? "GET" : "POST"
  35.                     })
  36.                     .ToList();
  37.                 foreach (var action in actions)
  38.                 {
  39.                     Dictionary<string, object> actionAttributes = new();
  40.                     foreach (var parameter in action.Parameters)
  41.                     {
  42.                         var key = $"{parameter.Type} {parameter.Name}";
  43.                         if (parameter.Attributes.Any())
  44.                         {
  45.                             actionAttributes.Add(key, string.Join(", ", parameter.Attributes));
  46.                         }
  47.                     }
  48.                     themeinterfaces.Add(new Themeinterface
  49.                     {
  50.                         Action = action.ActionName,
  51.                         ActionName = action.ActionSummary,
  52.                         ActionAttributes = JsonConvert.SerializeObject(actionAttributes.Select(p => p.Value)),
  53.                         //ActionParams = string.Join(", ", action.Parameters.Select(p => p.Name)),
  54.                         Controller = controllerType.FullName!,
  55.                         ControllerName = GetMemberSummary(root, controllerType, xmlPath),
  56.                         Method = action.Method
  57.                     });
  58.                 }
  59.             }
  60.             return themeinterfaces;
  61.         }
复制代码
 

来源:https://www.cnblogs.com/runningprogrammer/archive/2023/08/28/controller-action-summary.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具