using System.Reflection; using System.Text; using Autofac; using Autofac.Core; using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.FileProviders; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using Serilog; using WIDESEA_Core; using WIDESEA_Core.Authorization; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Core; using WIDESEA_Core.Extensions; using WIDESEA_Core.Filter; using WIDESEA_Core.Helper; //using WIDESEA_Core.HostedService; using WIDESEA_Core.Middlewares; using WIDESEA_WMSServer.BackgroundServices; using WIDESEA_WMSServer.Filter; var builder = WebApplication.CreateBuilder(args); builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer(builder => { builder.RegisterModule(); // 注册接口依赖注入 builder.RegisterModule(); // 注册属性注入 }).ConfigureAppConfiguration((hostingContext, config) => { hostingContext.Configuration.ConfigureApplication(); config.Sources.Clear(); config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); }); builder.Host.UseSerilog((context, services, loggerConfiguration) => { loggerConfiguration .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day); }); builder.ConfigureApplication(); // App.ExpDateTime = DateTime.Parse("2025-03-31 00:00:00"); // 设置过期时间 // 2. 配置服务 builder.Services.AddSingleton(new AppSettings(builder.Configuration)); // 注册配置 builder.Services.AddAllOptionRegister(); // 获取配置文件 builder.Services.AddSingleton(); builder.Services.Configure( builder.Configuration.GetSection("AutoOutboundTask")); builder.Services.AddMemoryCacheSetup(); // 缓存服务 builder.Services.AddWebSocketSetup(); builder.Services.AddSqlsugarSetup(); // SqlSugar 数据库配置 builder.Services.AddDbSetup(); // Db 数据库配置 builder.Services.AddInitializationHostServiceSetup(); // 应用程序初始化服务注册 builder.Services.AddHostedService(); // 启动自动出库任务后台服务 // builder.Services.AddHostedService(); // 权限数据服务 builder.Services.AddAutoMapperSetup(); builder.Services.AddCorsSetup(); builder.Services.AddMiniProfilerSetup(); builder.Services.AddSwaggerSetup(); builder.Services.AddHttpContextSetup(); builder.Services.AddMvc(options => { options.Filters.Add(typeof(ApiAuthorizeFilter)); options.Filters.Add(typeof(ActionExecuteFilter)); }); builder.Services.AddScoped(); builder.Services.AddAuthorizationSetup(); builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration); // IP限流 中间件注册 builder.Services.AddScoped(); builder.Services.AddSession(); builder.Services.AddHttpClient(); builder.Services.AddControllers(o => { o.Filters.Add(typeof(GlobalExceptionsFilter)); // 全局异常处理 }) .AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; options.SerializerSettings.NullValueHandling = NullValueHandling.Include; options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; options.SerializerSettings.Converters.Add(new StringEnumConverter()); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.Replace(ServiceDescriptor.Transient()); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var app = builder.Build(); // 3. 配置中间件 app.UseMiniProfiler(); // 性能分析 app.ConfigureApplication(); // 应用配置 app.UseApplicationSetup(); // 应用启动 app.UseAllServicesMiddle(builder.Services); app.UseSession(); app.UseSwaggerAuthorized(); app.UseSwaggerMiddle(() => Assembly.GetExecutingAssembly().GetManifestResourceStream("WIDESEA_WMSServer.index.html") ?? throw new Exception("WIDESEA_WMSServer.index.html文件不存在")); app.UseIpLimitMiddle(); app.UseApiLogMiddleware(); // todo // app.UseRecordAccessLogsMiddle(); DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions(); defaultFilesOptions.DefaultFileNames.Clear(); defaultFilesOptions.DefaultFileNames.Add("index.html"); app.UseDefaultFiles(defaultFilesOptions); app.UseMiddleware(); app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(App.WebHostEnvironment.WebRootPath) }); app.UseCookiePolicy(); app.UseStatusCodePages(); app.UseRouting(); app.UseCors(AppSettings.Get(new string[] { "Cors", "PolicyName" })); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();