asp.net core 3.0 中使用 swagger

Intro

上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口不涉及到认证以及 api 版本控制,最近把另外一个 api 项目升级到了 3.0,还是遇到了一些问题,这里单独写一篇文章介绍,避免踩坑。

Swagger 基本使用

swagger 服务注册:

services.AddSwaggerGen(option =>  {   option.SwaggerDoc("sparktodo", new OpenApiInfo    {   Version = "v1",  Title = "SparkTodo API", Description = "API for SparkTodo",   Contact = new OpenApiContact() { Name = "WeihanLi", Email = "weihanli@outlook.com" }    }); // include document file    option.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Startup).Assembly.GetName().Name}.xml"), true);    });

中间件配置:

//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{   option.SwaggerEndpoint("/swagger/sparktodo/swagger.json", "sparktodo Docs");    option.RoutePrefix = string.Empty; option.DocumentTitle = "SparkTodo API";
});

为 Swagger 添加 Bearer Token 认证

services.AddSwaggerGen(option =>
{   // ...  // Add security definitions option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()    {   Description = "Please enter into field the word 'Bearer' followed by a space and the JWT value",   Name = "Authorization",  In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey,  }); option.AddSecurityRequirement(new OpenApiSecurityRequirement    {   { new OpenApiSecurityScheme {   Reference = new OpenApiReference() {   Id = "Bearer",   Type = ReferenceType.SecurityScheme    }   }, Array.Empty<string>() }    });
});

支持多个 ApiVersion

services.AddApiVersioning(options => {   options.AssumeDefaultVersionWhenUnspecified = true;    options.DefaultApiVersion = ApiVersion.Default;    options.ReportApiVersions = true;  });
services.AddSwaggerGen(option =>
{   // ...  option.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "API V1" });  option.SwaggerDoc("v2", new OpenApiInfo { Version = "v2", Title = "API V2" });  option.DocInclusionPredicate((docName, apiDesc) =>  {   var versions = apiDesc.CustomAttributes()  .OfType<ApiVersionAttribute>()    .SelectMany(attr => attr.Versions); return versions.Any(v => $"v{v.ToString()}" == docName);    }); option.OperationFilter<RemoveVersionParameterOperationFilter>();  option.DocumentFilter<SetVersionInPathDocumentFilter>();
});

自定义 Api version 相关的 OperationFilter:

public class SetVersionInPathDocumentFilter : IDocumentFilter
{   public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)    {   var updatedPaths = new OpenApiPaths(); foreach (var entry in swaggerDoc.Paths) {   updatedPaths.Add(   entry.Key.Replace("v{version}", swaggerDoc.Info.Version), entry.Value);   }   swaggerDoc.Paths = updatedPaths;   }
}
public class RemoveVersionParameterOperationFilter : IOperationFilter
{   public void Apply(OpenApiOperation operation, OperationFilterContext context)   {   // Remove version parameter from all Operations var versionParameter = operation.Parameters.Single(p => p.Name == "version");  operation.Parameters.Remove(versionParameter);  }
}

中间件配置:

//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{   option.SwaggerEndpoint("/swagger/v2/swagger.json", "V2 Docs");  option.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");  option.RoutePrefix = string.Empty; option.DocumentTitle = "SparkTodo API";
});

最终 swagger 效果

Memo

上面的配置来自 https://github.com/WeihanLi/SparkTodo 这个项目,要获取代码可以参考这个项目

Reference

  • https://github.com/domaindrivendev/Swashbuckle.AspNetCore/tree/master/test/WebSites/MultipleVersions/Swagger

  • https://stackoverflow.com/questions/58197244/swaggerui-with-netcore-3-0-bearer-token-authorization

  • https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1295

  • https://github.com/WeihanLi/SparkTodo

asp.net core 3.0 中使用 swagger相关推荐

  1. ASP.NET Core Web API中使用Swagger

    本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger   在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...

  2. 在ASP.NET Core 2.0中创建Web API

    目录 介绍 先决条件 软件 技能 使用代码 第01步 - 创建项目 第02步 - 安装Nuget包 步骤03 - 添加模型 步骤04 - 添加控制器 步骤05 - 设置依赖注入 步骤06 - 运行We ...

  3. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  4. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  5. ASP.Net Core 2.0中的Razor Page不是WebForm

    随着.net core2.0的发布,我们可以创建2.0的web应用了.2.0中新东西的出现,会让我们忘记老的东西,他就是Razor Page.下面的这篇博客将会介绍ASP.Net Core 2.0中的 ...

  6. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  7. ASP.NET Core 3.0中支持AI的生物识别安全

    本文共两个部分,这是第一部分,其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型. 此部分提供了此授权进程的基于生物识别信息(如人脸识别或语音识别)的 ...

  8. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...

  9. 在ASP.NET Core 2.0中使用MemoryCache

    说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...

最新文章

  1. boost::interprocess::offset_ptr用法的测试程序
  2. 无监督和有监督的区别_干货|全面理解无监督学习基础知识
  3. 关于单片机串口发送和接收的问题
  4. 基因功能不确定?做一下单基因GSEA怎么样?
  5. 13篇京东CVPR 2019论文!你值得一读~
  6. 图标设计素材|解析UI设计图标
  7. 华为NP课程笔记11-STP+RSTP
  8. Mybatis常见技巧
  9. pytorch动态调整学习率之Poly策略
  10. jQuery-对联广告
  11. Hinton 论文系列《A fast learning algorithm for deep belief nets》
  12. JAVA练习10-累加数
  13. 医疗器械软件测试相关
  14. 一种下载Nvidia旧版本显卡驱动的方法(在知道版本号的前提下)
  15. GitLab删除项目操作(亲测)
  16. 上海市食品药品监督管理局
  17. B-spline三次B样条曲线方程
  18. 【嵌入式开发基础】PL2303不支持win11及后续版本解决方法
  19. shell脚本学习笔记一
  20. fwr171改无线服务器,迅捷(Fast)FWR171无线路由模式设置

热门文章

  1. 【知识分享】异步调用与多线程的区别
  2. 蚁族之痛:过年如过关
  3. android bilibili搜索框,仿bilibili搜索框效果(三句代码实现)
  4. 如何在Photoshop中制作双曝光图像
  5. windows安装程序创建_如何在Windows上创建已安装程序的列表
  6. /hgfs下无共享文件夹?/mnt下没有hgfs文件夹?vmhgfs-fuse:找不到命令?
  7. 数据库设计-基础-1-教务科研申报系统设计UML用例图
  8. InfoQ —— 腾讯游戏大数据服务场景与应用
  9. C#内建接口:IComparable
  10. Web实时通信,SignalR真香,不用愁了