.net core webapi swagger 配置

BBS.Extensions 项目 这里扩展了 中间件 和注入配置

项目文件 

添加 

<GenerateDocumentationFile>True</GenerateDocumentationFile>

 <NoWarn>$(NoWarn);1591</NoWarn>

生成xml文件

 

 

 

 

需要Nuget下载相关的包

Swashbuckle.AspNetCore.SwaggerUI

 

 

 

 

Swashbuckle.AspNetCore.Filters

用途是要在Swagger下可以输入 token

 

 

 注入扩展配置代码 需要显示 依赖的Model的xml注释

 

   /// <summary>
      /// Swagger注入扩展
      /// </summary>
      public static class SwaggerExtend
      {
          /// <summary>
          /// 扩展
         /// </summary>
         /// <param name="services"></param>
         /// <param name="BaseDirectoryPath"></param>
         public static void AddSwagger(this IServiceCollection services, string BaseDirectoryPath)
         {
             AddDefaultSwagger(services, options =>
             {
                 //开启小锁
                 options.OperationFilter<AddResponseHeadersFilter>();
                 options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
                 //在header 中添加token 传给后台
                options.OperationFilter<SecurityRequirementsOperationFilter>();

               //  options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
               //  {
               //      Description = "jwt授权直接在下框输入token,格式 bearer+空格+token",
               //      Name = "Authorization",//默认参数名称
               //      In = ParameterLocation.Header,
               //      Type = SecuritySchemeType.ApiKey
               //  });
                            

options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "jwt授权直接在下框输入token,格式 bearer+空格+token",
Name = "Authorization",//默认参数名称
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer"
});

//添加安全要求
options.AddSecurityRequirement(new OpenApiSecurityRequirement {
{
new OpenApiSecurityScheme{
Reference =new OpenApiReference{
Type = ReferenceType.SecurityScheme,
Id ="Bearer"
}
},new string[]{ }
}
});



 
                 options.SwaggerDoc("v1", new OpenApiInfo
                 {
                    Version = "v0,1,0",
                     Title = "BBS.API",
                     Description = "框架说明文档",
                     Contact = new OpenApiContact
                     {
                         Name = "BBS.Code",
                        Email = "8@qq.com",
                     }
                 });
                 DirectoryInfo directoryInfo = new DirectoryInfo(BaseDirectoryPath);
                 FileInfo[] fileInfos = directoryInfo.GetFiles("*.xml");
                 foreach (var fileInfo in fileInfos)
                 {
                     string xmlPath = Path.Combine(BaseDirectoryPath, fileInfo.FullName);
                     options.IncludeXmlComments(xmlPath, true);
                 }
            });
         }
         /// <summary>
         /// 默认
         /// </summary>
         /// <param name="services"></param>
         /// <param name="setupAction"></param>
         public static void AddDefaultSwagger(this IServiceCollection services, Action<SwaggerGenOptions> setupAction)
         {
            services.AddSwaggerGen(setupAction);
         }
    }

 

 

 

 

中间件的扩展

 这里注意route前缀为空 不用 swagger/Index.html 只需要 Index.html

 1  public static class SwaggerMiddleware
 2     {
 3         /// <summary>
 4         /// 扩展
 5         /// </summary>
 6         /// <param name="app"></param>
 7         /// <param name="version"></param>
 8         /// <returns></returns>
 9         public static IApplicationBuilder UseMySwagger(this IApplicationBuilder app, string version="v1")
10         {
11             UseDefaultSwagger(app,options =>
12             {
13                 options.SwaggerEndpoint("/swagger/v1/swagger.json", version);
14                 //route前缀为空 不用 swagger/Index.html 只需要 Index.html
15                 options.RoutePrefix = "";
16             });
17             return app;
18         }
19         /// <summary>
20         /// 默认
21         /// </summary>
22         /// <param name="app"></param>
23         /// <param name="setupAction"></param>
24         /// <returns></returns>
25         public static IApplicationBuilder UseDefaultSwagger(this IApplicationBuilder app, Action<SwaggerUIOptions> setupAction)
26         {
27             app.UseSwagger();
28             app.UseSwaggerUI(setupAction);
29             return app;
30         }
31     }

如果配置了 RoutePrefix = "" 需要配置 launchSettings.json 

"launchUrl": " "

 

 

 使用配置好的注入扩展 和 中间件

 

 

 

 

 

 

 

 

测试验证

 

 

 

 

注意 swagger默认 访问http  如果 出现 postman访问 200 swagger 访问401 可能原因是 强制重定向 https了 需要将 app.UseHttpsRedirection() 注释掉

在.NET Core WebAPI中,使用 app.UseHttpsRedirection() 中间件可能导致部分请求(如Swagger的GET请求)因HTTPS重定向引发401未授权错误,而POST请求却能返回200。以下是具体原因及解决方案:

 

    1. HTTPS重定向与认证逻辑冲突
      app.UseHttpsRedirection() 会将所有HTTP请求自动重定向到HTTPS端口。在此过程中,原始请求的 Authorization请求头可能丢失,导致后续认证中间件(如JWT验证)无法识别Token,从而返回401错误

      • GET请求特点:浏览器或Swagger UI默认优先使用HTTP访问,触发重定向时可能丢弃Header。
      • POST请求特点:若直接通过HTTPS访问(如Postman),或重定向逻辑未触发,则不会丢失Header。

 

posted on 2023-04-15 14:21  是水饺不是水饺  阅读(120)  评论(0)    收藏  举报

导航