SwaggerExtension.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Infrastructure;
  2. using Microsoft.AspNetCore.Authentication.JwtBearer;
  3. using Microsoft.OpenApi.Models;
  4. using Swashbuckle.AspNetCore.Filters;
  5. namespace ZR.Admin.WebApi.Extensions
  6. {
  7. public static class SwaggerExtension
  8. {
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. /// <param name="app"></param>
  13. public static void UseSwagger(this IApplicationBuilder app)
  14. {
  15. app.UseSwagger(c =>
  16. {
  17. c.RouteTemplate = "swagger/{documentName}/swagger.json";
  18. c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
  19. {
  20. var url = $"{httpReq.Scheme}://{httpReq.Host.Value}";
  21. var referer = httpReq.Headers["Referer"].ToString();
  22. if (referer.Contains(GlobalConstant.DevApiProxy))
  23. url = referer[..(referer.IndexOf(GlobalConstant.DevApiProxy, StringComparison.InvariantCulture) + GlobalConstant.DevApiProxy.Length - 1)];
  24. swaggerDoc.Servers =
  25. new List<OpenApiServer>
  26. {
  27. new OpenApiServer
  28. {
  29. Url = url
  30. }
  31. };
  32. });
  33. });
  34. app.UseSwaggerUI(c => c.SwaggerEndpoint("v1/swagger.json", "ZrAdmin v1"));
  35. }
  36. public static void AddSwaggerConfig(this IServiceCollection services)
  37. {
  38. if (services == null) throw new ArgumentNullException(nameof(services));
  39. //IWebHostEnvironment hostEnvironment = App.GetRequiredService<IWebHostEnvironment>();
  40. services.AddSwaggerGen(c =>
  41. {
  42. c.SwaggerDoc("v1", new OpenApiInfo
  43. {
  44. Title = "ZrAdmin.NET Api - .NET6",
  45. Version = "v1",
  46. Description = "",
  47. });
  48. try
  49. {
  50. var tempPath = "";// hostEnvironment.ContentRootPath;
  51. //添加文档注释
  52. c.IncludeXmlComments(Path.Combine(tempPath, "ZRAdmin.xml"), true);
  53. c.IncludeXmlComments(Path.Combine(tempPath, "ZRModel.xml"), true);
  54. //c.IncludeXmlComments(Path.Combine(Directory.GetParent(tempPath).FullName, "ZR.Model", "ZRModel.xml"), true);
  55. }
  56. catch (Exception ex)
  57. {
  58. Console.WriteLine("swagger 文档加载失败" + ex.Message);
  59. }
  60. //参考文章:http://www.zyiz.net/tech/detail-134965.html
  61. //需要安装包Swashbuckle.AspNetCore.Filters
  62. // 开启权限小锁 需要在对应的Action上添加[Authorize]才能看到
  63. c.OperationFilter<AddResponseHeadersFilter>();
  64. c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
  65. //在header 中添加token,传递到后台
  66. c.OperationFilter<SecurityRequirementsOperationFilter>();
  67. c.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme,
  68. new OpenApiSecurityScheme
  69. {
  70. In = ParameterLocation.Header,
  71. Description = "请输入Login接口返回的Token,前置Bearer。示例:Bearer {Token}",
  72. Name = "Authorization",//jwt默认的参数名称,
  73. Type = SecuritySchemeType.ApiKey, //指定ApiKey
  74. BearerFormat = "JWT",//标识承载令牌的格式 该信息主要是出于文档目的
  75. Scheme = JwtBearerDefaults.AuthenticationScheme//授权中要使用的HTTP授权方案的名称
  76. });
  77. c.AddSecurityRequirement(new OpenApiSecurityRequirement
  78. {
  79. {
  80. new OpenApiSecurityScheme
  81. {
  82. Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
  83. },
  84. new List<string>()
  85. }
  86. });
  87. });
  88. }
  89. }
  90. }