关于Asp.Net Core如何更完美地配置swagger(三)

  • A+
所属分类:.NET技术
摘要

  说到Asp.Net Core配置swagger,网上的文章数不胜数,这里重新写篇文章一方面主要在于加强自己的学习,另一方面做好swagger的授权验证配置。

 

关于.netcore 模块化框架系列文章

极简实用的Asp.NetCore模块化框架决定免费开源了(一)

ASP.NET Core如何自动生成小写的破折号路由(二)

 

目的 

说到Asp.Net Core配置swagger,网上的文章数不胜数,这里重新写篇文章一方面主要在于加强自己的学习,另一方面做好swagger的授权验证配置。

配置

nuge引用两个包

1、Swashbuckle.AspNetCore

2、Swashbuckle.AspNetCore.Filters

3、下面附上我的swagger扩展类

 

public static  class SwaggerExtesion     {                public static void AddSwaggerSetup(this IServiceCollection services)         {             services.AddSwaggerGen(c =>             {                 c.SwaggerDoc("v1", new OpenApiInfo { Title = $"接口文档——{RuntimeInformation.FrameworkDescription}", Version = "v1", Description = "HTTP API" });                 c.OrderActionsBy(o => o.RelativePath);                 var basePath = PlatformServices.Default.Application.ApplicationBasePath;                 var files = Directory.GetFiles(basePath, "*.xml");                 foreach (var file in files)                 {                     c.IncludeXmlComments(file, true);                     if (file.Contains("ShenNius.Share.Models.xml"))                     {                         c.IncludeXmlComments(file);                     }                 }                 //var baseModelPath = AppContext.BaseDirectory;                 //var xmlModelPath = Path.Combine(basePath, "ShenNius.Share.Models.xml");//这个就是Model层的xml文件名                 //c.IncludeXmlComments(xmlModelPath);                 c.CustomOperationIds(apiDesc =>                 {                     return apiDesc.TryGetMethodInfo(out MethodInfo methodInfo) ? methodInfo.Name : null;                 });                  // TODO:一定要返回true!                 c.DocInclusionPredicate((docName, description) =>                 {                     return true;                 });                  ////https://github.com/domaindrivendev/Swashbuckle.AspNetCore                    // 开启加权小锁                 c.OperationFilter<AddResponseHeadersFilter>();                 c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();                 //// 在header中添加token,传递到后台                 c.OperationFilter<SecurityRequirementsOperationFilter>();  // 很重要!这里配置安全校验,和之前的版本不一样                 c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme                 {                     Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)"",                     Name = "Authorization",//jwt默认的参数名称                     In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)                     Type = SecuritySchemeType.ApiKey,                     Scheme = "Bearer",                 });                 // c.AddFluentValidationRules();                 c.AddSecurityRequirement(new OpenApiSecurityRequirement {                     {                        new OpenApiSecurityScheme{                          Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }                        },                        new[] { "readAccess", "writeAccess" }                     }                 });             });         }          public static void UseSwaggerMiddle(this IApplicationBuilder app)         {             app.UseSwagger();             app.UseSwaggerUI(c =>             {                 c.DefaultModelExpandDepth(2);                 c.DefaultModelRendering(ModelRendering.Example);                 c.DefaultModelsExpandDepth(-1);                  c.DisplayRequestDuration();                 c.DocExpansion(DocExpansion.None);                 c.EnableDeepLinking();                 c.EnableFilter();                 c.MaxDisplayedTags(int.MaxValue);                 c.ShowExtensions();                 c.EnableValidator();                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "ShenNius API v1");                 c.RoutePrefix = string.Empty;             });         }     }

 

 4、在OnConfigureServices方法中注入context.Services.AddSwaggerSetup();

说明

关于上面的配置是关于我ShenNius.Framework和swagger的结合,只是和.net core中的配置略有不同而已。

暂时就写到这里吧,每次文章写的很长,反而很多人看不下去,我将功能点拆分出来,每次尽量只耽误3、4分钟的样子,点进文章之后能快速看到核心的东西,保证有收获。