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 Serilog.Formatting.Json;
|
using System.Reflection;
|
using System.Text;
|
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<ContainerBuilder>(builder =>
|
{
|
builder.RegisterModule<AutofacModuleRegister>(); // 注册接口依赖注入
|
builder.RegisterModule<AutofacPropertityModuleReg>(); // 注册属性注入
|
}).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(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
|
.WriteTo.File(
|
//new JsonFormatter(renderMessage: true),
|
"logs/serilog-.log",
|
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}",
|
rollingInterval: RollingInterval.Day,
|
retainedFileCountLimit: 30,
|
// 每个日志文件最大大小(字节),此处设置为10MB
|
fileSizeLimitBytes: 10 * 1024 * 1024,
|
shared: true
|
)
|
// 6. 可选:输出到Seq日志服务器(结构化日志服务器)
|
// 需要安装 Serilog.Sinks.Seq NuGet包,并确保Seq服务在 http://localhost:5341 运行
|
// 如不需要Seq日志,注释掉下方代码即可
|
.WriteTo.Seq(
|
serverUrl: "http://localhost:5341",
|
apiKey: "CWVa8UWQ9CdUp9GWXCPL", // 如Seq需要ApiKey则配置真实密钥
|
batchPostingLimit: 1000, // 批量发送数量
|
period: TimeSpan.FromSeconds(2) // 发送间隔
|
);
|
});
|
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<RoundRobinService>();
|
builder.Services.Configure<AutoOutboundTaskOptions>(
|
builder.Configuration.GetSection("AutoOutboundTask"));
|
builder.Services.AddMemoryCacheSetup(); // 缓存服务
|
builder.Services.AddWebSocketSetup();
|
builder.Services.AddSqlsugarSetup(); // SqlSugar 数据库配置
|
builder.Services.AddDbSetup(); // Db 数据库配置
|
builder.Services.AddInitializationHostServiceSetup(); // 应用程序初始化服务注册
|
builder.Services.AddHostedService<AutoOutboundTaskBackgroundService>(); // 启动自动出库任务后台服务
|
// builder.Services.AddHostedService<PermissionDataHostService>(); // 权限数据服务
|
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.AddSignalR();
|
|
builder.Services.AddScoped<HttpClientHelper>();
|
|
builder.Services.AddAuthorizationSetup();
|
|
builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration); // IP限流 中间件注册
|
|
builder.Services.AddScoped<UseServiceDIAttribute>();
|
|
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<IControllerActivator, ServiceBasedControllerActivator>());
|
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<HttpRequestMiddleware>();
|
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.MapHub<WIDESEA_WMSServer.Hubs.StockHub>("/stockHub");
|
|
app.Run();
|