using AdminAPI.Filters;using AdminAPI.Libraries;using AdminAPI.Models.AppSetting;using Common;using DistributedLock.Redis;using Logger.DataBase;using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http.Features;using Microsoft.AspNetCore.HttpOverrides;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Server.Kestrel.Core;using Microsoft.EntityFrameworkCore;using Microsoft.IdentityModel.Tokens;using Microsoft.OpenApi.Models;using Swashbuckle.AspNetCore.SwaggerGen;using System.Security.Cryptography;namespace AdminAPI{public class Program{public static void Main(string[] args){EnvironmentHelper.ChangeDirectory(args);var builder = WebApplication.CreateBuilder(args);builder.Host.UseWindowsService();#region 启用 Kestrel Https 并绑定证书//builder.WebHost.UseKestrel(options =>//{// options.ConfigureHttpsDefaults(options =>// {// options.ServerCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Path.Combine(AppContext.BaseDirectory, "xxxx.pfx"), "123456");// });//});//builder.WebHost.UseUrls("https://*");#endregionbuilder.Services.AddDbContextPool<Repository.Database.DatabaseContext>(options =>{options.UseSqlServer(builder.Configuration.GetConnectionString("dbConnection"));}, 100);#region 基础 Server 配置builder.Services.Configure<FormOptions>(options =>{options.MultipartBodyLengthLimit = long.MaxValue;});builder.Services.Configure<KestrelServerOptions>(options =>{options.AllowSynchronousIO = true;});builder.Services.Configure<IISServerOptions>(options =>{options.AllowSynchronousIO = true;});builder.Services.AddHsts(options =>{options.MaxAge = TimeSpan.FromDays(365);});builder.Services.Configure<ForwardedHeadersOptions>(options =>{options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;});builder.Services.AddResponseCompression(options =>{options.EnableForHttps = true;});#endregion#region 注册 JWT 认证机制builder.Services.AddAuthentication(options =>{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{var jwtSetting = builder.Configuration.GetSection("JWT").Get<JWTSetting>();var issuerSigningKey = ECDsa.Create();issuerSigningKey.ImportSubjectPublicKeyInfo(Convert.FromBase64String(jwtSetting.PublicKey), out int i);options.TokenValidationParameters = new TokenValidationParameters{ValidIssuer = jwtSetting.Issuer,ValidAudience = jwtSetting.Audience,IssuerSigningKey = new ECDsaSecurityKey(issuerSigningKey)};});builder.Services.AddAuthorization(options =>{options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().RequireAssertion(context => IdentityVerification.Authorization(context)).Build();});#endregion//注册HttpContextbuilder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//注册全局过滤器builder.Services.AddMvc(options => options.Filters.Add(new GlobalFilter()));//注册跨域信息builder.Services.AddCors(options =>{options.AddPolicy("cors", policy =>{policy.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();});});#region 注册 Json 序列化配置builder.Services.AddControllers().AddJsonOptions(options =>{options.JsonSerializerOptions.Converters.Add(new Common.JsonConverter.LongConverter());});#endregion#region 注册 Swaggerbuilder.Services.AddSwaggerGen(options =>{options.SwaggerDoc("v1", null);var modelPrefix = "AdminShared.Models.";options.SchemaGeneratorOptions = new SchemaGeneratorOptions { SchemaIdSelector = type => (type.ToString()[(type.ToString().IndexOf("Models.") + 7)..]).Replace(modelPrefix, "").Replace("`1", "").Replace("+", ".") };options.MapType<long>(() => new OpenApiSchema { Type = "string", Format = "long" });options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml"), true);#region 开启 Swagger JWT 鉴权模块options.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme(){Type = SecuritySchemeType.Http,Scheme = "bearer",BearerFormat = "JWT"});options.AddSecurityRequirement(new OpenApiSecurityRequirement{{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "bearerAuth"}},new string[] {}}});#endregion});#endregion//注册统一模型验证builder.Services.Configure<ApiBehaviorOptions>(options =>{options.InvalidModelStateResponseFactory = actionContext =>{//获取验证失败的模型字段var errors = actionContext.ModelState.Where(e => e.Value?.Errors.Count > 0).Select(e => e.Value?.Errors.First().ErrorMessage).ToList();var dataStr = string.Join(" | ", errors);//设置返回内容var result = new{errMsg = dataStr};return new BadRequestObjectResult(result);};});//注册雪花ID算法builder.Services.AddSingleton(new Common.SnowflakeHelper(0, 0));//注册分布式锁 Redis模式builder.Services.AddRedisLock(options =>{options.Configuration = builder.Configuration.GetConnectionString("redisConnection");options.InstanceName = "lock";});#region 注册缓存服务//注册缓存服务 内存模式builder.Services.AddDistributedMemoryCache();//注册缓存服务 Redis模式//builder.Services.AddStackExchangeRedisCache(options =>//{// options.Configuration = builder.Configuration.GetConnectionString("redisConnection");// options.InstanceName = "cache";//});#endregion#region 注册HttpClientbuilder.Services.AddHttpClient("", options =>{options.DefaultRequestVersion = new Version("2.0");}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler{AllowAutoRedirect = false});#endregionbuilder.Services.BatchRegisterServices();#region 注册文件服务//builder.Services.AddTencentCloudSMS(options =>//{// var settings = builder.Configuration.GetSection("TencentCloudSMS").Get<SMS.TencentCloud.Models.SMSSetting>();// options.AppId = settings.AppId;// options.SecretId = settings.SecretId;// options.SecretKey = settings.SecretKey;//});//builder.Services.AddAliCloudSMS(options =>//{// var settings = builder.Configuration.GetSection("AliCloudSMS").Get<SMS.AliCloud.Models.SMSSetting>();// options.AccessKeyId = settings.AccessKeyId;// options.AccessKeySecret = settings.AccessKeySecret;//});#endregion#region 注册日志服务//注册数据库日志服务builder.Logging.AddDataBaseLogger(options => { });//注册本地文件日志服务//builder.Logging.AddLocalFileLogger(options => { });#endregionvar app = builder.Build();app.UseForwardedHeaders();app.UseResponseCompression();//开启倒带模式允许多次读取 HttpContext.Body 中的内容app.Use(async (context, next) =>{context.Request.EnableBuffering();await next.Invoke();});if (app.Environment.IsDevelopment()){app.UseDeveloperExceptionPage();}else{//注册全局异常处理机制app.UseExceptionHandler(builder => builder.Run(async context => await GlobalError.ErrorEvent(context)));}app.UseHsts();//注册跨域信息app.UseCors("cors");//强制重定向到Httpsapp.UseHttpsRedirection();app.UseStaticFiles();app.UseRouting();//注册用户认证机制,必须放在 UseCors UseRouting 之后app.UseAuthentication();app.UseAuthorization();//注入 adminapp 项目//app.MapWhen(ctx => ctx.Request.Path.Value.ToLower().Contains("/admin"), adminapp =>//{// adminapp.UseStaticFiles("/admin");// adminapp.UseBlazorFrameworkFiles("/admin");// adminapp.UseEndpoints(endpoints =>// {// endpoints.MapFallbackToFile("/admin/{*path:nonfile}", "admin/index.html");// });//});app.MapControllers();#region 启用 Swaggerapp.UseSwagger();app.UseSwaggerUI(options =>{options.SwaggerEndpoint($"/swagger/v1/swagger.json", null);});#endregionapp.Run();}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。