using log4net; 
 | 
using Microsoft.Extensions.DependencyInjection; 
 | 
using Microsoft.OpenApi.Models; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Runtime.InteropServices; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEA_Core.Helper; 
 | 
using static WIDESEA_Core.Extensions.CustomApiVersion; 
 | 
using Swashbuckle.AspNetCore.Filters; 
 | 
  
 | 
namespace WIDESEA_Core.Extensions 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// Swagger  
 | 
    /// </summary> 
 | 
    public static class SwaggerSetup 
 | 
    { 
 | 
  
 | 
        private static readonly ILog log = 
 | 
        LogManager.GetLogger(typeof(SwaggerSetup)); 
 | 
        /// <summary> 
 | 
        /// Swagger 
 | 
        /// </summary> 
 | 
        /// <param name="services"></param> 
 | 
        /// <exception cref="ArgumentNullException"></exception> 
 | 
        public static void AddSwaggerSetup(this IServiceCollection services) 
 | 
        { 
 | 
            if (services == null) throw new ArgumentNullException(nameof(services)); 
 | 
  
 | 
            var basePath = AppContext.BaseDirectory; 
 | 
            //var basePath2 = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath; 
 | 
            var ApiName = AppSettings.app(new string[] { "ApiName" }); 
 | 
  
 | 
            services.AddSwaggerGen(c => 
 | 
            { 
 | 
                //遍历出全部的版本,做文档信息展示 
 | 
                typeof(ApiVersions).GetEnumNames().ToList().ForEach(version => 
 | 
                { 
 | 
                    c.SwaggerDoc(version, new OpenApiInfo 
 | 
                    { 
 | 
                        Version = version, 
 | 
                        Title = $"{ApiName} 接口文档——{RuntimeInformation.FrameworkDescription}", 
 | 
                        Description = $"{ApiName} HTTP API " + version, 
 | 
                        //Contact = new OpenApiContact { Name = ApiName, Email = "Blog.Core@xxx.com", Url = new Uri("https://neters.club") }, 
 | 
                        //License = new OpenApiLicense { Name = ApiName + " 官方文档", Url = new Uri("http://apk.neters.club/.doc/") } 
 | 
                    }); 
 | 
                    //c.OrderActionsBy(o => o.RelativePath); 
 | 
                }); 
 | 
  
 | 
                c.UseInlineDefinitionsForEnums(); 
 | 
                try 
 | 
                { 
 | 
                    //这个就是刚刚配置的xml文件名 
 | 
                    //var xmlPath = Path.Combine(basePath, "Blog.Core.xml"); 
 | 
                    //默认的第二个参数是false,这个是controller的注释,记得修改 
 | 
                    //c.IncludeXmlComments(xmlPath, true); 
 | 
  
 | 
                    //这个就是Model层的xml文件名 
 | 
                    //var xmlModelPath = Path.Combine(basePath, "Blog.Core.Model.xml"); 
 | 
                    //c.IncludeXmlComments(xmlModelPath); 
 | 
                } 
 | 
                catch (Exception ex) 
 | 
                { 
 | 
                    log.Error("Blog.Core.xml和Blog.Core.Model.xml 丢失,请检查并拷贝。\n" + ex.Message); 
 | 
                } 
 | 
  
 | 
                // 开启加权小锁 
 | 
                c.OperationFilter<AddResponseHeadersFilter>(); 
 | 
                c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); 
 | 
  
 | 
                // 在header中添加token,传递到后台 
 | 
                //c.OperationFilter<SecurityRequirementsOperationFilter>(); 
 | 
  
 | 
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme 
 | 
                { 
 | 
                    Description = "JWT授权token前面需要加上字段Bearer与一个空格,如Bearer token", 
 | 
                    Name = "Authorization", 
 | 
                    In = ParameterLocation.Header, 
 | 
                    Type = SecuritySchemeType.ApiKey, 
 | 
                    BearerFormat = "JWT", 
 | 
                    Scheme = "Bearer" 
 | 
                }); 
 | 
  
 | 
                c.AddSecurityRequirement(new OpenApiSecurityRequirement 
 | 
                { 
 | 
                    { 
 | 
                        new OpenApiSecurityScheme 
 | 
                        { 
 | 
                            Reference = new OpenApiReference { 
 | 
                                Type = ReferenceType.SecurityScheme, 
 | 
                                Id = "Bearer" 
 | 
                            } 
 | 
                        }, 
 | 
                        new string[] { } 
 | 
                    } 
 | 
                }); 
 | 
            }).AddControllers() 
 | 
            .ConfigureApiBehaviorOptions(options => 
 | 
            { 
 | 
                options.SuppressConsumesConstraintForFormFileParameters = true; 
 | 
                options.SuppressInferBindingSourcesForParameters = true; 
 | 
                options.SuppressModelStateInvalidFilter = true; 
 | 
                options.SuppressMapClientErrors = true; 
 | 
                options.ClientErrorMapping[404].Link = 
 | 
                    "https://*/404"; 
 | 
            }); 
 | 
            //services.AddSwaggerGenNewtonsoftSupport(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 自定义版本 
 | 
    /// </summary> 
 | 
    public class CustomApiVersion 
 | 
    { 
 | 
        /// <summary> 
 | 
        /// Api接口版本 自定义 
 | 
        /// </summary> 
 | 
        public enum ApiVersions 
 | 
        { 
 | 
            /// <summary> 
 | 
            /// V1 版本 
 | 
            /// </summary> 
 | 
            V1 = 1, 
 | 
            /// <summary> 
 | 
            /// V2 版本 
 | 
            /// </summary> 
 | 
            V2 = 2, 
 | 
        } 
 | 
    } 
 | 
} 
 |