using System; using SimApi.Helpers; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerUI; using SimApi.Middlewares; namespace SimApi { /// /// 加入系统的扩展信息 /// public static class Extensions { //**********快捷添加************** /// /// 添加整个SimApiAPI,同时增加CORS规则 /// /// /// /// /// public static IServiceCollection AddSimApiApi(this IServiceCollection builder, string title, string description = null) { return builder.AddSimApiAuth().AddSimApiDoc(title, description).AddCors().AddSimApiUpload(); } /// /// 使用所有SimApiApi自定义中间件 /// /// /// /// /// /// public static IApplicationBuilder UseSimApiApi(this IApplicationBuilder builder, string title = "API文档", params SubmitMethod[] submitMethods) { return builder.UseSimApiException().UseSimApiDoc(title, submitMethods).UseMiddleware().UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()).UseSimApiUpload(); } //*********组件快捷方式************* /// /// 添加自定义授权认证中间价 /// /// /// public static IServiceCollection AddSimApiAuth(this IServiceCollection builder) { return builder.AddScoped(); } /// /// 添加Base64上传组件 /// /// /// public static IServiceCollection AddSimApiUpload(this IServiceCollection builder) { return builder.AddSingleton(); } /// /// 添加Api文档服务 /// /// /// 文档标题 /// 文档描述 /// public static IServiceCollection AddSimApiDoc(this IServiceCollection builder, string title, string description = null) { return builder.AddSwaggerGen(x => { x.SwaggerDoc("api", new OpenApiInfo { Title = title, Description = description }); x.EnableAnnotations(); x.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "HeaderToken"} }, new[] {"readAccess", "writeAccess"} } }); x.AddSecurityDefinition("HeaderToken", new OpenApiSecurityScheme { Name = "Token", In = ParameterLocation.Header }); }); } /// /// 使用异常中间价扩展 /// /// /// public static IApplicationBuilder UseSimApiException(this IApplicationBuilder builder) { return builder.UseMiddleware(); } /// /// 配置上传组件必须 /// /// /// public static IApplicationBuilder UseSimApiUpload(this IApplicationBuilder builder) { return builder.UseStaticFiles(new StaticFileOptions { DefaultContentType = "application/x-msdownload", ServeUnknownFileTypes = true }); } /// /// 使用文档UI /// /// /// 文档标题 /// 文档支持的提交方式(如果不指定,默认使用POST) /// public static IApplicationBuilder UseSimApiDoc(this IApplicationBuilder builder, string title, params SubmitMethod[] submitMethods) { return builder.UseSwagger(x => x.RouteTemplate = "docs/{documentName}.json").UseSwaggerUI(x => { x.RoutePrefix = "docs"; x.DocumentTitle = title; x.SwaggerEndpoint("/docs/api.json", name: title); x.EnableValidator(); if (submitMethods.Length > 0) { x.SupportedSubmitMethods(submitMethods); } else { x.SupportedSubmitMethods(SubmitMethod.Post); } x.DisplayRequestDuration(); }); } /// /// 同时使用Api文档和异常处理中间件 /// /// /// 文档标题 /// API提交方式定义 /// public static IApplicationBuilder UseSimApiDocEx(this IApplicationBuilder builder, string title = "API文档", params SubmitMethod[] submitMethods) { return builder.UseSimApiException().UseSimApiDoc(title, submitMethods); } /// /// 使用自定义认证中间件(依赖IDistributedCache) /// /// /// public static IApplicationBuilder UseSimApiAuth(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } }