第10章Swagger自定义实现index.html页

news2024/11/18 12:32:16

1 初始化index.html页

    复制原程序“index.html”页的内容到当前程序员“index.html”页。

    注意:是内容复制,如果是页面替换复制,则必须重新把“index.html”页的属性中的“生成操作”设定为:“嵌入的资源”。

2 自定义SwaggerSetup依赖注入中间件

    using Common.GlobalVar;

using Common.Helper;

using log4net;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.OpenApi.Models;

using Swashbuckle.AspNetCore.Filters;

using System.Runtime.InteropServices;

using static Extensions.ServiceExtensions.CustomApiVersion;

namespace Extensions.ServiceExtensions

{

    /// <summary>

    /// Swagger依赖注入--类】

    /// </summary>

    /// <remarks>

    /// 摘要:

    ///     通过AddSwaggerGen依赖注入中间,获取Api控制器方法的版本控制信息和注释等数据信息,依赖注入.Net7框架的内置容器中,为在“index.html”页面上渲染显示这些信息,作好预处理操作。

    /// </remarks>

    public static class SwaggerSetup

    {

        #region 变量--私有/保护----静态

        /// <summary>

        /// 【日志】

        /// <remarks>

        /// 摘要:

        ///     通过“Log4net”日志中间件实例,把当前类的操作信息持久化;或显显示在控制台窗口中。

        /// </remarks>

        /// </summary>

        private static readonly ILog log = LogManager.GetLogger(typeof(SwaggerSetup));

        #endregion

        #region 方法--静态

        ///<param name="services">.Net(Core)框架内置依赖注入容器实例。</param>

        /// <summary>

        /// 【添加SqlSugar注入】

        /// </summary>

        /// <remarks>

        /// 摘要:

        ///     通过AddSwaggerGen依赖注入中间,获取Api控制器方法的版本控制信息和注释等数据信息,依赖注入.Net7框架的内置容器中,为在“index.html”页面上渲染显示这些信息,作好预处理操作。

        /// </remarks>

        public static void AddSwaggerSetup(this IServiceCollection services)

        {

            if (services == null) throw new ArgumentNullException(nameof(services));

            var basePath = AppContext.BaseDirectory;

            //var basePath2 = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;

            var ApiName = AppSettings.app(new string[] { "Startup", "ApiName" });

            services.AddSwaggerGen(c =>

            {

                //遍历出全部的版本,做文档信息展示

                typeof(ApiVersions).GetEnumNames().ToList().ForEach(version =>

                {

                    c.SwaggerDoc(version, new OpenApiInfo

                    {

                        Version = version,

                        Title = $"{ApiName} 接口文档——{RuntimeInformation.FrameworkDescription}",

                        Description = $"{ApiName} HTTP API " + version,

                        Contact = new OpenApiContact { Name = ApiName, Email = "Blog.Core@xxx.com", Url = new Uri("https://neters.club") },

                        License = new OpenApiLicense { Name = ApiName + " 官方文档", Url = new Uri("http://apk.neters.club/.doc/") }

                    });

                    c.OrderActionsBy(o => o.RelativePath);

                });

                c.UseInlineDefinitionsForEnums();

                try

                {

                    //这个就是刚刚配置的xml文件名

                    var xmlPath = Path.Combine(basePath, "WebApi.xml");

                    //默认的第二个参数是false,这个是controller的注释,记得修改

                    c.IncludeXmlComments(xmlPath, true);

                    //这个就是Model层的xml文件名

                    var xmlModelPath = Path.Combine(basePath, "Blog.Core.Model.xml");

                    c.IncludeXmlComments(xmlModelPath);

                }

                catch (Exception ex)

                {

                    log.Error("WebApi.xmlBlog.Core.Model.xml 丢失,请检查并拷贝。\n" + ex.Message);

                }

                //Nuget--Swashbuckle.AspNetCore.Filters

                // 开启加权小锁

                c.OperationFilter<AddResponseHeadersFilter>();

                c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();

                // header中添加token,传递到后台

                c.OperationFilter<SecurityRequirementsOperationFilter>();

                // ids4jwt切换

                if (Permissions.IsUseIds4)

                {

                    //接入identityserver4

                    c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme

                    {

                        Type = SecuritySchemeType.OAuth2,

                        Flows = new OpenApiOAuthFlows

                        {

                            Implicit = new OpenApiOAuthFlow

                            {

                                AuthorizationUrl = new Uri($"{AppSettings.app(new string[] { "Startup", "IdentityServer4", "AuthorizationUrl" })}/connect/authorize"),

                                Scopes = new Dictionary<string, string> {

                                {

                                    "blog.core.api","ApiResource id"

                                }

                            }

                            }

                        }

                    });

                }

                else

                {

                    // Jwt Bearer 认证,必须是 oauth2

                    c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme

                    {

                        Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",

                        Name = "Authorization",//jwt默认的参数名称

                        In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)

                        Type = SecuritySchemeType.ApiKey

                    });

                }

            });

            //Nuget--Swashbuckle.AspNetCore.Newtonsoft

            services.AddSwaggerGenNewtonsoftSupport();

        }

        #endregion

    }

    /// <summary>

    /// 【自定义Api版本--类】

    /// <remarks>

    /// 摘要:

    ///    该类中的枚举实例通过版本分类的方式,把当前程序中的Api控制器方法分为两类(也可以分为更多的类)

    /// 应用场景:

    ///     在由于前端版本迭代,而需要更新Api控制器方法时,为了兼容旧的前端就需要“Api版本控制在不修改旧的Api控制器方法,而是定义新的Api控制器方法,来解决前端版本迭代的兼容性问题。

    /// </remarks>

    /// </summary>

    public class CustomApiVersion

    {

        /// <summary>

        /// Api版本--枚举】

        /// <remarks>

        /// 摘要:

        ///    该枚举通过版本分类的方式,把当前程序中的Api控制器方法分为两类(也可以分为更多的类)

        /// 应用场景:

        ///     在由于前端版本迭代,而需要更新Api控制器方法时,为了兼容旧的前端就需要“Api版本控制在不修改旧的Api控制器方法,而是定义新的Api控制器方法,来解决前端版本迭代的兼容性问题。

        /// </remarks>

        /// </summary>

        public enum ApiVersions

        {

            /// <summary>

            /// V1

            /// <remarks>

            /// 摘要:

            ///    1种版本分类的Api控制器方法。

            /// </remarks>

            /// </summary>

            V1 = 1,

           

            /// <summary>

            /// V2

            /// <remarks>

            /// 摘要:

            ///    2种版本分类的Api控制器方法。

            /// </remarks>

            /// </summary>

            V2 = 2,

        }

    }

}

3 重构Program类

//通过AddSwaggerGen依赖注入中间,获取Api控制器方法的版本控制信息和注释等数据信息,依赖注入.Net7框架的内置容器中,为在“index.html”页面上渲染显示这些信息,作好预处理操作。

builder.Services.AddSwaggerSetup();

builder.Services.AddControllers();

    按F5执行程序,在执行登录操作后,即可跳转到自定义的“index.html”面,如上图所示

对以上功能更为具体实现和注释见:221202_09Blog(Swagger自定义实现index.html页)。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】堆和优先级队列

目录 一、堆 1.1堆的特点 1.2如何构造一个最大堆 &#xff08;1&#xff09;最大堆的构造以及常用方法的实现 &#xff08;2&#xff09;添加操作 &#xff08;3&#xff09;删除操作 &#xff08;3&#xff09;将任意数组调整为堆 二、TopK问题 2.1使用优先级队列 &am…

jenkins 参数化构建发布到kubernetes集群不同的命名空间下

最终效果 在构建前可以选择参数,要拉取的Git分支、什么命名空间下、什么服务。 自由风格项目使用的jenkins agent镜像,请参考这个文章: 【DevOps】(2022.11更新)基于jenkins/jnlp-slave:4.13.3-1-jdk11镜像,加入kubectl、mvn命令_阳光很暖吧的博客-CSDN博客 1、自由风格项…

广告和电商应该怎么串联起来呢?我们可以从各大巨头的动作中发掘

电商广告是广告产业与电子商务模式联姻的时代产物&#xff0c;是把广告、传媒、营销推广产业链的各种产品和服务搬到网上&#xff0c;利用网络便捷的实现广告资源信息流通、在线交易和客户关系管理的一种商业模式&#xff0c;是广告业营销模式和渠道的创新。 电商平台从无到有…

一篇文章彻底理解自定义View

目录 一.View的基础 1.view的基础概念 2.view的位置和事件event几种表示法 3.view的滑动 ①.ScrollTo、ScrollBy: ②.布局位置(layout,offsetLeftAndRight,offsetTopAndBottom) ③.布局参数(LayoutParams) 4.view的弹性滑动 ①.ScrollercomputeScrollscrollTo ②.动画…

如何基于YAML设计接口自动化测试框架?看完秒会

在设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML、CSV&#xff09;或者数据库中&#xff0c;实现脚本与数据解耦&#xff0c;方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测试用例&…

部署高校房屋管理系统可以实现哪些目标?

数图互通房产管理 随着技术的不断进步和升级&#xff0c;以及高校房屋建筑物数量的不断扩充&#xff0c;建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。数图互通自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管…

工业数据与数据采集应用如何在ARM+FPGA异核架构的米尔MYC-JX8MMA7核心板应用

随着通信与网络技术、互联网的发展&#xff0c;工业管理数据化、网络化、智能化已成大势所趋&#xff0c;利用工业物联网完成工业控制是智慧工厂中必不可少的一部分。传统的控制与数据采集系统&#xff0c;主机一旦需要同时与多个数据采集设备保持高速通信&#xff0c;并要承担…

Golang【Web 入门】 07 路由 - http.ServeMux

阅读目录说明ServeMux 和 Handler重构&#xff1a;区分不同的 Handler查看 http.HandleFunc 源码重构&#xff1a;使用自定义的 ServeMuxhttp.ServeMux 的局限性URI 路径参数请求方法过滤不支持路由命名http.ServeMux 的优缺点标准库里的就是最好的&#xff1f;说明 goblog 需…

【运维心得】ApacheDirectory找不到java路径的解决方案

目录 ApacheDirectory是什么&#xff1f; 问题现象描述 解决步骤 总结 本文是因为没有在网上找到类似的问题和文章&#xff0c;只能依靠自己去解决&#xff0c;既然解决了&#xff0c;就应该分享一下&#xff0c;希望能帮到需要的朋友。 ApacheDirectory是什么&#xff1f…

火山引擎 DataTester 揭秘:字节如何用 A/B 测试,解决增长问题的?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 上线六年&#xff0c;字节跳动的短视频产品——抖音已成为许多人记录美好生活的平台。除了抖音&#xff0c;字节跳动旗下还同时运营着数十款产品&#xff0c;从资讯…

人工智能在网络安全中的重要性

介绍&#xff1a; 人工智能&#xff08;AI&#xff09;是计算机科学的一个分支&#xff0c;基于某些独特的算法和相关数学计算&#xff0c;使机器能够拥有人类的决策能力。另一方面&#xff0c;网络安全包括保护虚拟世界免受网络攻击和威胁的安全措施。人工智能能够通过采取与…

第二十一章《万年历》第1节:万年历项目简介

万年历项目实现的是一款日历软件,它能够展示出任意年份的日历,除此之外,该软件还能以红色字体标出每个月的阳历节日。 21.1.1万年历功能简介 万年历软件的运行结果如图21-1所示。 图21-1万年历软件界面 为方便讲述,此处把这个万年历的界面分成了4个区域,每个区域当中都有…

【优化发电】基于matlab差分进化算法求解单库发电优化问题【含Matlab源码 2253期】

⛄一、差分进化算法简介 如同所有的优化算法一样, 差分进化算法基于种群的进化算法。差分进化算法主要的参数主要有种群规模NP, 解空间的维数D, 缩放因子F和交叉概率Cr。D维矢量XGi[xGi,1, xGi,2, …, xi, DG], i1, 2, …, Np, 表示G代第i个个体。变异和交叉操作在每一代中产生…

NIO-ServerSocketChannel和Tomcat

ServerSocketChannel 面向流的侦听套接字的可选通道。 通过调用此类的open方法创建服务器套接字通道。 无法为任意预先存在的ServerSocket创建通道。 新创建的服务器套接字通道已打开但尚未绑定。 尝试调用未绑定的服务器套接字通道的accept方法将导致抛出NotYetBoundExcepti…

达梦数据库通过作业实现自动备份功能

达梦数据库通过作业实现自动备份功能作业功能简介一、通过DM管理工具创建备份作业(图形化配置)1.创建代理环境2.创建作业二、命令行方式配置备份作业案例1.创建代理环境2.全量备份3.增量备份4.备份清理三、JOB 运行和日志查看作业功能简介 在管理员的工作中&#xff0c;有许多…

安卓APP源码和设计报告——好再来点餐

大作业文档 项目名称&#xff1a;好再来点餐专业&#xff1a;班级&#xff1a;学号&#xff1a;姓名&#xff1a; 目 录 一、项目功能介绍3 二、项目运行环境3 1、开发环境3 2、运行环境3 3、是否需要联网3 三、项目配置文件及工程结构3 1、工程配置文件3 2、工程结构…

STC - 同时外挂扩展RAM和12864时, C库函数失效的问题

文章目录STC - 同时外挂扩展RAM和12864时, C库函数失效的问题概述笔记原理图 - 外挂XRAM原理图 - 12864错误现象总结ENDSTC - 同时外挂扩展RAM和12864时, C库函数失效的问题 概述 在写STC15实验箱4的出厂测试程序. 发现memset(buf, 0, 256)一片256字节的xdata内存时, 无法将这…

生产型企业如何搭建进销存管理系统?低代码平台了解一下

生产型企业在激烈的市场竞争中充分意识到信息化管理的重要性&#xff0c;但限于资金压力无法购买或开发大型的ERP 系统整合企业管理的小型企业而言&#xff0c;比较多的采用部署相对独立的小型信息系统提高管理信息化水平&#xff0c;常见的包括采购管理系统、销售管理系统、库…

Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡

Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡查看磁盘信息查看磁盘原挂载点永久开机自动挂载分区——修改文件/etc/fstab应用挂载修改docker默认存储路径查看磁盘信息 sudo fdisk -l如果磁盘太多可以用 sudo fdisk -l | grep GiB只看以GB为单位的磁盘&…

【D3.js】2.2-给 Circle 元素添加属性

title: 【D3.js】2.2-给 Circle 元素添加属性 date: 2022-12-02 15:19 tags: [JavaScript,CSS,HTML,D3.js,SVG] 上章节中虽然添加了circle&#xff0c;但是因为缺少某些属性设置而显得不可见&#xff0c;在此章节中将学习circle的cx、cy、r属性。 一、学习目标 circle的x坐标与…