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 ...
随机推荐
- 移动端安卓和 IOS 开发框架 Framework7 布局
对应的各种效果,Framework7 里面实现的方式比较多,这里我就只写我用的一种,样式有的自己修改了的,想看官方详细的参见 http://framework7.cn 一.手风琴布局Accordion ...
- SOCKET_CONNECT_TIMEOUT is the timeout for the connection to be established and SOCKET_TIMEOUT
https://github.com/niwinz/django-redis/blob/master/doc/content.adoc#32-socket-timeout 3.2. Socket ti ...
- IFC数据模型构件控制
控制ifc构件的隐藏与显示.着色 osg::ref_ptr<osg::Geode> geode1 = new osg::Geode(); osg::ref_ptr<osg::Stat ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_05-方法授权-方法授权测试
这是我们课程的服务里面 加了授权的方法 重启课程管理的服务 首先需要登陆 在redis复制token 访问课程列表 用最新复制的令牌 最新token可以 调用teachplan方法 调用 一个没加注解 ...
- java生成RSA公私钥字符串,简单易懂
java生成RSA公私钥字符串,简单易懂 解决方法: 1.下载bcprov-jdk16-140.jar包,参考:http://www.yayihouse.com/yayishuwu/chapter ...
- python 对xls写入信息
只能新创建xls # coding=utf-8import xlwt writebook = xlwt.Workbook() #打开excel test= writebo ...
- MySQL高性能优化指导思路
MySQL架构图: 连接池组件.管理服务和工具组件.SQL接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理文件: 1.连接层:主要完成一些类似于连接处理,授权认证及相关的方案: 2 ...
- Tips for Conda
管理环境 创建环境 基于 python3.6 创建一个名为test_py3的环境 conda create -n test_py3 python=3.6 基于 python2.7 创建一个名为test ...
- laravel console handle 传参方法
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Libs\wxpay\CLogFile ...
- css3 animation 点亮灯光效果
<style> .wrap .bulb { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50% ...