Swagger 实践 <一>
1. 新建。net core 的webapi 项目。
2.Install-Package NSwag.AspNetCore
3.ServiceConfig() 中添加 services.AddSwaggerDocument();
这一步是添加某些依赖注入的。里面有好多。serviceCollection.AddSingleton() 之类的东西。 源码:https://github.com/RicoSuter/NSwag
4.Config() 中添加
app.UseOpenApi(); 里面主要是 app.UseMiddleware<OpenApiDocumentMiddleware>(),添加了中间件
app.UseSwaggerUi3(); 这里也是添加一些中间件
下面探究下原理:
OpenApiDocumentMiddleware 这个中间件中有一个 _documentsCache 字典。这个字典会包含有那个 Webapi暴露的接口的Json。
这个字典是个缓存。就是只生成一次。下次再刷新 。。。/swagger/v1/json 的时候,直接接从字典里拿。
最终生成的方法在这里:
public async Task<OpenApiDocument> GenerateAsync(object serviceProvider)
{
var typedServiceProvider = (IServiceProvider)serviceProvider; var mvcOptions = typedServiceProvider.GetRequiredService<IOptions<MvcOptions>>();
var settings = GetJsonSerializerSettings(typedServiceProvider) ??
Settings?.ActualSerializerSettings ??
JsonConvert.DefaultSettings?.Invoke(); Settings.ApplySettings(settings, mvcOptions.Value); var apiDescriptionGroupCollectionProvider = typedServiceProvider.GetRequiredService<IApiDescriptionGroupCollectionProvider>();
return await GenerateAsync(apiDescriptionGroupCollectionProvider.ApiDescriptionGroups);
}
核心代码是标粗的。这两句话放在普通工程里也能读出所有暴露出的接口。
后一句是创建IApiDescriptionGroupCollectionProvider 这个接口的实例。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
刚进入这个方法的时候,services 有53个元素。
执行完 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); 变为260个,新增的就有 IApiDescriptionGroupCollectionProvider。
Lifetime = Singleton, ServiceType = {Name = "IApiDescriptionGroupCollectionProvider" FullName = "Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionGroupCollectionProvider"}, ImplementationType = {Name = "ApiDescriptionGroupCollectionProvider" FullName = "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider"}
Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider的源码:
最后,接口的列表元素类型是这个:
ApiDescription
Swagger 实践 <一>的更多相关文章
- Swagger 实践 <二>
1. 新建.netCore WebApi 项目(选择Angular).按照上一篇的加上Swage 文档,使http://localhost:11934/swagger/v1/swagger.json ...
- ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除
本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...
- ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询
上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构
咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 文章管理架构
上次把member的用户部分完成,现在开始做文章管理部分.文章部分根据涉及显示现实文章列表,发布文章,修改文章,删除文章等功能.最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
随机推荐
- Somatic hypermutation (or SHM) is a cellular mechanism by which the immune system adapts to the new foreign elements that confront it (e.g. microbes), as seen during class switching. Somatic hypermut
Somatic hypermutation (or SHM) is a cellular mechanism by which the immune system adapts to the new ...
- ISO/IEC 9899:2011 条款6.4.9——注释
6.4.9 注释 1.除了在一个字符常量.一个字符串字面量.或一个注释内,字符 /* 引入一个注释.这么一个注释的内容被检查仅用于标识多字节字符,并且要找到 */ 来终结.[注:从而,/* ... * ...
- 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播
加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...
- React vs. Angular vs. Vue
原文连接 历史 React是一个用于构建Web应用程序UI组件的JavaScript库. React由Facebook维护,许多领先的科技品牌在其开发环境中使用React. React被Faceboo ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_07-Feign远程调用-Feign测试
2.2.1 Feign介绍 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Cloud引入 Feign并且集成了Ribbon实 ...
- 算法习题---4.4信息解码(UVa213)
一:题目 消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. (一)题目详细 你的程序的编码方案的 ...
- Qt编写数据导出到Excel及Pdf和打印数据
一.前言 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询 ...
- 未清SO关闭处理
使用: SD_SALESDOCUMENT_CHANGE 关闭订单 DATA: ls_header_in LIKE bapisdhd1 . DATA: ls_header_inx LIKE bap ...
- linux上安装pycharm
百度搜索pycharm 然后打开pycharm的官网 然后在官网首页点击down,下载linux版pycharm 上传到linux服务器.解压 然后再打开bin目录 执行:sh ./pycharm.s ...
- laravel输出HTML内容
blade模板引擎中的{{ $xxx }}表达式的返回值将被自动传递给 PHP 的 htmlentities 函数进行处理,以防止 XSS 攻击. 如果需要展示未转义的数据,可以使用{!! $xxx ...