有個(gè)項(xiàng)目需要獲取項(xiàng)目?jī)?nèi)所有Action,并在凌晨定時(shí)任務(wù)跑完所有接口檢查是否有接口報(bào)錯(cuò),寫了如下方法:
/// <summary> /// 獲取Action注釋 /// </summary> /// <param name="root"></param> /// <param name="method">方法</param> /// <param name="xmlPath">項(xiàng)目xml路徑</param> /// <returns></returns> static string? GetMethodSummary(XmlElement root, MethodInfo method, string xmlPath) { // 查找方法的注釋節(jié)點(diǎn) string memberName = GetMethodSignature(method); XmlNode? memberNode = root.SelectSingleNode($"//member[@name='{memberName}']"); // 獲取方法的 <summary> 注釋 XmlNode? summaryNode = memberNode?.SelectSingleNode("summary"); string? summary = summaryNode?.InnerText.Trim(); return summary; }
/// <summary> /// 獲取控制器注釋 /// </summary> /// <param name="root"></param> /// <param name="controllerType">控制器</param> /// <param name="xmlPath">項(xiàng)目xlm路徑</param> /// <returns></returns> static string? GetMemberSummary(XmlElement root, Type controllerType, string xmlPath) { // 查找方法的注釋節(jié)點(diǎn) string memberName = $"T:{controllerType.FullName}"; XmlNode? memberNode = root.SelectSingleNode($"//member[@name='{memberName}']"); // 獲取方法的 <summary> 注釋 XmlNode? summaryNode = memberNode?.SelectSingleNode("summary"); string? summary = summaryNode?.InnerText.Trim(); return summary; }
/// <summary> /// 獲取方法簽名 /// </summary> /// <param name="methodInfo"></param> /// <returns></returns> static string GetMethodSignature(MethodInfo methodInfo) { StringBuilder signatureBuilder = new StringBuilder(); signatureBuilder.Append($"M:{methodInfo.DeclaringType!.FullName}.{methodInfo.Name}"); ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length > 0) { signatureBuilder.Append("("); for (int i = 0; i < parameters.Length; i++) { ParameterInfo parameter = parameters[i]; // 判斷是否為泛型類型 if (parameter.ParameterType.IsGenericType) { Type genericTypeDefinition = parameter.ParameterType.GetGenericTypeDefinition(); Type[] genericArguments = parameter.ParameterType.GetGenericArguments(); string typeName = $"{genericTypeDefinition.FullName!.Remove(genericTypeDefinition.FullName.IndexOf('`'))}{{"; for (int j = 0; j < genericArguments.Length; j++) { typeName += $"{genericArguments[j].FullName},"; } typeName = typeName.TrimEnd(',') + "}"; signatureBuilder.Append(typeName); } else { signatureBuilder.Append(parameter.ParameterType.FullName); } if (i < parameters.Length - 1) { signatureBuilder.Append(","); } } signatureBuilder.Append(")"); } return signatureBuilder.ToString(); }
實(shí)體類:
ublic class Themeinterface { /// <summary> /// 方法 /// </summary> [Description("方法")] [StringLength(50)] [Column("Action")] public string Action { get; set; } /// <summary> /// 方法特性 /// </summary> [Description("方法特性")] [Column("ActionAttributes")] public string? ActionAttributes { get; set; } /// <summary> /// 方法名稱 /// </summary> [Description("方法名稱")] [Column("ActionName")] public string? ActionName { get; set; } /// <summary> /// 方法參數(shù) /// </summary> [Description("方法參數(shù)")] [Column("ActionParams")] public string? ActionParams { get; set; } /// <summary> /// 控制器 /// </summary> [Description("控制器")] [StringLength(255)] [Column("Controller")] public string Controller { get; set; } /// <summary> /// 控制器名稱 /// </summary> [Description("控制器名稱")] [Column("ControllerName")] public string? ControllerName { get; set; } [Key] [Column("Id")] public int Id { get; set; } /// <summary> /// 調(diào)用時(shí)間 /// </summary> [Description("調(diào)用時(shí)間")] [Column("InvokeTime")] public int? InvokeTime { get; set; } /// <summary> /// 執(zhí)行狀態(tài) /// </summary> public string Status { get; set; } /// <summary> /// /// </summary> public int StatusCode { get; set; } /// <summary> /// 請(qǐng)求方法 /// </summary> public string? Method { get; set; } /// <summary> /// /// </summary> public string? IP { get; set; } /// <summary> /// 異常 /// </summary> public string? Exception { get; set; } /// <summary> /// 請(qǐng)求路徑 /// </summary> public string? Path { get; set; } /// <summary> /// 請(qǐng)求參數(shù) /// </summary> public string? QueryString { get; set; } /// <summary> /// /// </summary> public DateTime? CreateTime { get; set; } /// <summary> /// /// </summary> public DateTime? UpdateTime { get; set; } }
使用:文章來源:http://www.zghlxwxcb.cn/news/detail-677411.html
/// <summary> /// 獲取所有接口 /// </summary> /// <returns></returns> public static List<Themeinterface> GetAllInterface() { // 獲取方法的 XML 文檔路徑 string xmlPath = Assembly.GetExecutingAssembly().Location.Replace("dll", "xml"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); XmlElement root = xmlDoc.DocumentElement!; var childControllers = Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.IsSubclassOf(typeof(BaseController)) && t != typeof(BaseController) && !t.IsDefined(typeof(IgnoreInterfaceAttribute))) .ToList(); List<Themeinterface> themeinterfaces = new(); foreach (var controllerType in childControllers) { var actions = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance) .Where(m => (typeof(IActionResult).IsAssignableFrom(m.ReturnType) || typeof(Task<IActionResult>).IsAssignableFrom(m.ReturnType)) && m.DeclaringType == controllerType && !m.IsDefined(typeof(IgnoreInterfaceAttribute))) .Select(m => new { ActionName = m.Name, Parameters = m.GetParameters() .Select(p => new { Name = p.Name, Type = p.ParameterType.FullName, Attributes = p.GetCustomAttributes().Select(attr => attr.GetType().Name).ToList() }) .ToList(), ActionSummary = GetMethodSummary(root, m, xmlPath), Method = m.GetCustomAttributes(typeof(HttpPostAttribute), false).Cast<HttpPostAttribute>().FirstOrDefault() == null ? "GET" : "POST" }) .ToList(); foreach (var action in actions) { Dictionary<string, object> actionAttributes = new(); foreach (var parameter in action.Parameters) { var key = $"{parameter.Type} {parameter.Name}"; if (parameter.Attributes.Any()) { actionAttributes.Add(key, string.Join(", ", parameter.Attributes)); } } themeinterfaces.Add(new Themeinterface { Action = action.ActionName, ActionName = action.ActionSummary, ActionAttributes = JsonConvert.SerializeObject(actionAttributes.Select(p => p.Value)), //ActionParams = string.Join(", ", action.Parameters.Select(p => p.Name)), Controller = controllerType.FullName!, ControllerName = GetMemberSummary(root, controllerType, xmlPath), Method = action.Method }); } } return themeinterfaces; }
?文章來源地址http://www.zghlxwxcb.cn/news/detail-677411.html
到了這里,關(guān)于.net core Api獲取所有Action以及注釋內(nèi)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!