国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.net core Api獲取所有Action以及注釋內(nèi)容

這篇具有很好參考價(jià)值的文章主要介紹了.net core Api獲取所有Action以及注釋內(nèi)容。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

有個(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; }
}

使用:

        /// <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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 解決安裝了.NET Core或.NET Framework 或 ,但代碼無提示(注釋)問題

    解決安裝了.NET Core或.NET Framework 或 ,但代碼無提示(注釋)問題

    1、進(jìn)入微軟官方下載頁(yè)面:https://dotnet.microsoft.com/zh-cn/download/intellisense 2、找到對(duì)應(yīng)的.NET版本和適用于 Windows 的本地化 IntelliSense 下載安裝即可。 詳細(xì)安裝可以參考:https://docs.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense?WT.mc_id=dotnet-35129-website 1、進(jìn)入微軟官方下載頁(yè)面:

    2024年02月08日
    瀏覽(20)
  • 基于.Net Core實(shí)現(xiàn)的飛書所有文檔一鍵導(dǎo)出服務(wù)(支持多系統(tǒng))

    基于.Net Core實(shí)現(xiàn)的飛書所有文檔一鍵導(dǎo)出服務(wù)(支持多系統(tǒng))

    一個(gè)支持Windows、Mac、Linux系統(tǒng)的飛書文檔一鍵導(dǎo)出服務(wù),僅需一行命令即可將飛書知識(shí)庫(kù)的全部文檔同步到本地電腦。支持導(dǎo)出 markdown , docx , pdf 三種格式。導(dǎo)出速度嘎嘎快,實(shí)測(cè) 700 多個(gè)文檔導(dǎo)出只需 25 分鐘,且程序是后臺(tái)掛機(jī)運(yùn)行,不影響正常工作。查看最新更新 最近

    2024年02月12日
    瀏覽(21)
  • .net Core API 添加 NLog

    nlog.config program.cs? NuGet packages:NLog、NLog.Web.AspNetCore?

    2024年02月12日
    瀏覽(13)
  • ASP.NET CORE API 使用Orleans

    ASP.NET CORE API 使用Orleans

    快速使用Monimal API 快速集成Orleans 微軟官網(wǎng)地址如下: https://learn.microsoft.com/zh-cn/dotnet/orleans/quickstarts/build-your-first-orleans-app?source=recommendationstabs=visual-studio 當(dāng)然它的存儲(chǔ)grain存儲(chǔ)采用的是內(nèi)存級(jí)別存儲(chǔ),我緩存了mssql 存儲(chǔ)。如果是內(nèi)存存儲(chǔ)使用如下代碼就Ok 我采用的是數(shù)據(jù)庫(kù)存

    2024年02月06日
    瀏覽(23)
  • .NET Core使用 CancellationToken 取消API請(qǐng)求

    .NET Core使用 CancellationToken 取消API請(qǐng)求

    您是否曾經(jīng)訪問過一個(gè)網(wǎng)站,它需要很長(zhǎng)時(shí)間加載,最終你敲擊 F5 重新加載頁(yè)面。 即使用戶刷新了瀏覽器取消了原始請(qǐng)求,而對(duì)于服務(wù)器來說,API也不會(huì)知道它正在計(jì)算的值將在結(jié)束時(shí)被丟棄,刷新五次,服務(wù)器將觸發(fā) 5 個(gè)請(qǐng)求。 為了解決這個(gè)問題,ASP.NET Core 為 Web 服務(wù)器

    2024年03月17日
    瀏覽(17)
  • ASP.NET Core Web API入門之三:使用EF Core

    ASP.NET Core Web API入門之三:使用EF Core

    一般來講我們做項(xiàng)目都會(huì)用實(shí)體類跟數(shù)據(jù)庫(kù)實(shí)體進(jìn)行關(guān)系對(duì)應(yīng),這樣的好處方便我們維護(hù)、增刪改查,并且可以減少SQL的編寫,從而統(tǒng)一風(fēng)格,那么 Entity Framework Core 就是很不錯(cuò)的ORM框架。 1、跨數(shù)據(jù)庫(kù)支持能力強(qiáng)大,只需修改配置就可以輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換。 2、提升了開發(fā)效

    2024年02月10日
    瀏覽(22)
  • 2.1 .net 8 ASP.NET Core Web API - Controller詳解

    2.1 .net 8 ASP.NET Core Web API - Controller詳解

    書接上回,上節(jié)我們留了幾個(gè)問題,即: 1、接口Hello的名字究竟怎么來的? 2、我們?nèi)绻氚呀涌诟某善渌拿Q,應(yīng)該怎么做? 3、我們繼承ControllerBase,以及[Route(“[controller]”)]屬性,又是分別起到什么作用? 需要解決以上幾個(gè)問題,我們就要繼續(xù)深入研究Controller相關(guān)的

    2024年02月20日
    瀏覽(22)
  • 最長(zhǎng)公共子序列(詳細(xì)代碼 注釋 分析 以及求出最長(zhǎng)公共子序列內(nèi)容方法)

    最長(zhǎng)公共子序列(詳細(xì)代碼 注釋 分析 以及求出最長(zhǎng)公共子序列內(nèi)容方法)

    文章有些長(zhǎng),希望能夠耐心看完,并且對(duì)你有幫助,文章是自己看了書之后,總結(jié)的,如果有什么錯(cuò)誤的地方,歡迎指出。 一些基本的概念: 子序列: 原序列中刪除若干個(gè)元素得到的序列,即原序列中可以不連續(xù)的一段 子串: 原序列中任意個(gè)連續(xù)的序列元素組成的序列,

    2023年04月15日
    瀏覽(22)
  • ASP.NET Core Web API用戶身份驗(yàn)證

    ASP.NET Core Web API用戶身份驗(yàn)證

    ASP.NET Core Web API用戶身份驗(yàn)證的方法有很多,本文只介紹JWT方法。JWT實(shí)現(xiàn)了服務(wù)端無狀態(tài),在分布式服務(wù)、會(huì)話一致性、單點(diǎn)登錄等方面凸顯優(yōu)勢(shì),不占用服務(wù)端資源。簡(jiǎn)單來說,JWT的驗(yàn)證過程如下所示: (1)通過用戶名和密碼獲取一個(gè)Token。 (2)訪問API時(shí),加上這個(gè)Toke

    2024年02月11日
    瀏覽(23)
  • 課程32:.Net Core Web API部署IIS

    2024年02月04日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包