240 lines
8.3 KiB
C#
Raw Normal View History

2023-06-09 18:10:38 +08:00
using AspNetCoreRateLimit;
2025-12-23 09:17:36 +08:00
using Infrastructure.Helper;
2022-03-06 14:26:05 +08:00
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.DataProtection;
2024-03-23 14:31:50 +08:00
using Microsoft.AspNetCore.Mvc;
2026-01-06 08:49:12 +08:00
using Microsoft.Extensions.DependencyInjection;
2023-06-09 18:10:38 +08:00
using Microsoft.IdentityModel.Tokens;
using System.Text.Json.Serialization;
2023-12-18 19:56:01 +08:00
using ZR.Admin.WebApi.AutoMapperProfile;
2025-12-23 08:59:30 +08:00
using ZR.Admin.WebApi.background;
2022-03-06 14:26:05 +08:00
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
2023-06-09 18:10:38 +08:00
using ZR.Admin.WebApi.Framework;
2022-03-06 14:26:05 +08:00
using ZR.Admin.WebApi.Hubs;
2023-06-09 18:10:38 +08:00
using ZR.Admin.WebApi.Middleware;
2023-03-08 13:02:38 +08:00
using ZR.Common.Cache;
using ZR.Common.MqttHelper;
2025-12-13 11:25:59 +08:00
using ZR.Service.mes.andon;
using ZR.Service.mqtt;
2026-01-06 08:49:12 +08:00
using ZR.Service.Utils.MyAlarmLigth;
2021-08-23 16:57:25 +08:00
2022-03-06 14:26:05 +08:00
var builder = WebApplication.CreateBuilder(args);
2025-12-13 11:25:59 +08:00
//后台定时任务
2026-01-09 10:26:40 +08:00
//builder.Services.AddHostedService<ScheduledBackgroundService>();
//builder.Services.AddHostedService<SocketBackgroundService>();
2025-12-23 08:59:30 +08:00
2025-12-13 11:29:55 +08:00
2022-03-06 14:26:05 +08:00
// Add services to the container.
2025-12-23 16:07:48 +08:00
builder.Services.AddControllers();
//配置中心
//builder.Configuration.AddNacosV2Configuration(builder.Configuration.GetSection("NacosConfig"));
//服务注册
//builder.Services.AddNacosAspNet(builder.Configuration);
2022-03-06 14:26:05 +08:00
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
2022-06-01 17:46:35 +08:00
//注入HttpContextAccessor
2022-03-06 14:26:05 +08:00
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// 注册MyMqttConfig依赖ILogger和IConfiguration
builder.Services.AddSingleton<MyMqttConfig>();
// 注册MqttService为单例服务并作为后台服务运行 !!!! 这样注册就行了 ================
builder.Services.AddSingleton<MqttService>();
builder.Services.AddHostedService(sp => sp.GetRequiredService<MqttService>());
/// ===============================================================================
// 注册TCP服务器服务
builder.Services.AddHostedService<ZR.Service.tcp.TcpServerService>();
2023-06-08 11:58:09 +08:00
// 跨域配置
builder.Services.AddCors(builder.Configuration);
2023-03-08 13:02:38 +08:00
// 显示logo
builder.Services.AddLogo();
2022-06-01 17:46:35 +08:00
//注入SignalR实时通讯默认用json传输
2022-03-06 14:26:05 +08:00
builder.Services.AddSignalR();
2022-06-01 17:46:35 +08:00
//消除Error unprotecting the session cookie警告
2022-03-06 14:26:05 +08:00
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "DataProtection"));
2022-06-01 17:46:35 +08:00
//普通验证码
2023-03-15 16:00:16 +08:00
builder.Services.AddCaptcha(builder.Configuration);
2023-05-12 15:08:24 +08:00
//IPRatelimit
builder.Services.AddIPRate(builder.Configuration);
2022-03-06 14:26:05 +08:00
//builder.Services.AddSession();
2024-01-04 09:01:03 +08:00
builder.Services.AddHttpContextAccessor();//todo 注册httpcontext 没事添加2个Httpcontext干嘛呀
2022-06-01 17:46:35 +08:00
//绑定整个对象到Model上
2022-03-06 14:26:05 +08:00
builder.Services.Configure<OptionsSetting>(builder.Configuration);
2024-01-04 09:01:03 +08:00
//jwt 认证 Bearer认证
2022-03-06 14:26:05 +08:00
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
2024-01-04 09:01:03 +08:00
}).AddCookie()//cookie 认证没用了吧
2022-03-06 14:26:05 +08:00
.AddJwtBearer(o =>
{
2023-08-02 13:36:44 +08:00
// 检查客户端和服务器的Token是否一样
2022-03-06 14:26:05 +08:00
o.TokenValidationParameters = JwtUtil.ValidParameters();
2023-06-08 11:58:09 +08:00
o.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
// 如果过期,把过期信息添加到头部
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
2022-03-06 14:26:05 +08:00
});
builder.Services.AddSingleton(new AppSettings(builder.Configuration));
2024-01-04 09:01:03 +08:00
builder.Services.AddAppService(); //todo 注册对象
2022-06-01 17:46:35 +08:00
//开启计划任务
2022-03-06 14:26:05 +08:00
builder.Services.AddTaskSchedulers();
2022-06-01 17:46:35 +08:00
//注册REDIS 服务
2023-03-08 13:02:38 +08:00
var openRedis = builder.Configuration["RedisServer:open"];
if (openRedis == "1")
2022-03-06 14:26:05 +08:00
{
2023-03-08 13:02:38 +08:00
RedisServer.Initalize();
}
2022-03-06 14:26:05 +08:00
builder.Services.AddMvc(options =>
{
2022-06-01 17:46:35 +08:00
options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
2022-03-06 14:26:05 +08:00
})
.AddJsonOptions(options =>
{
2023-07-27 17:56:52 +08:00
options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString;
options.JsonSerializerOptions.WriteIndented = true;
2022-03-06 14:26:05 +08:00
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
2023-10-12 10:23:34 +08:00
options.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
2022-03-06 14:26:05 +08:00
});
builder.Services.AddSwaggerConfig();
2023-12-18 19:56:01 +08:00
builder.Services.AddAutoMapper(typeof(AutoMapperProfile));
2024-03-23 14:31:50 +08:00
//关闭参数自动校验,我们需要返回自定义的格式
builder.Services.Configure<ApiBehaviorOptions>((o) =>
{
o.SuppressModelStateInvalidFilter = true;
});
2025-12-20 13:23:44 +08:00
// 注册 SocketGatewayServer 为 Singleton单例整个应用生命周期一个实例
2025-12-24 14:26:46 +08:00
//手表通知配置
2025-12-20 13:23:44 +08:00
builder.Services.AddSingleton<SocketGatewayServer>(provider =>
{
2026-01-08 10:57:12 +08:00
var server = new SocketGatewayServer("192.168.60.56", 8877); // 你可以按需修改 IP 和端口
2025-12-20 13:23:44 +08:00
server.Start(); // 项目启动时立即启动监听
//server.StartReceiving();
return server;
});
2025-12-24 14:26:46 +08:00
//三色灯网关IP配置
2026-01-06 08:49:12 +08:00
builder.Services.AddSingleton<ThreeColorLightModbus>(provider =>
2025-12-23 09:17:36 +08:00
{
2026-01-06 08:49:12 +08:00
var modbus = new ThreeColorLightModbus();
2025-12-24 14:26:46 +08:00
2026-01-06 08:49:12 +08:00
modbus.Connect("192.168.60.200", 9999); // 你可以按需修改 IP 和端口
2025-12-24 14:26:46 +08:00
2025-12-23 09:17:36 +08:00
return modbus;
});
2026-01-06 08:49:12 +08:00
//调漆房报警灯开关IP配置
builder.Services.AddSingleton<AlarmLightModbus>(provider =>
{
var modbus = new AlarmLightModbus();
modbus.Connect("192.168.60.105", 10001); // 你可以按需修改 IP 和端口
return modbus;
});
// 2. 注册调漆房灯控监听类
builder.Services.AddSingleton<TiaoQiFangLight>(provider =>
{
var modbusClient = provider.GetRequiredService<AlarmLightModbus>();
var logger = provider.GetRequiredService<ILogger<TiaoQiFangLight>>();
var lightListener = new TiaoQiFangLight(modbusClient, logger);
// 程序启动时自动启动监听
lightListener.StartListen();
return lightListener;
});
2022-03-06 14:26:05 +08:00
var app = builder.Build();
2026-01-09 10:26:40 +08:00
//using (var scope = app.Services.CreateScope())
//{
// var serviceProvider = scope.ServiceProvider;
// try
// {
// // 主动获取实例,强制执行上面的工厂方法
// var tiaoQiFangLight = serviceProvider.GetRequiredService<TiaoQiFangLight>();
// app.Logger.LogInformation("调漆房灯控监听已强制启动");
// }
// catch (Exception ex)
// {
// app.Logger.LogError(ex, "调漆房灯控监听启动失败");
// }
//}
2022-07-09 15:51:59 +08:00
InternalApp.ServiceProvider = app.Services;
2023-06-20 07:26:25 +08:00
InternalApp.Configuration = builder.Configuration;
InternalApp.WebHostEnvironment = app.Environment;
2023-06-09 18:10:38 +08:00
//初始化db
builder.Services.AddDb(builder.Configuration, app.Environment);
2022-07-01 22:39:39 +08:00
2024-01-04 09:01:03 +08:00
//《-----------------------------------------------------------------------------------------》
//《-----------------------------------------------------------------------------------------》
//《-----------------------------------------------------------------------------------------》
//《-----------------------------------------------------------------------------------------》
//《-----------------------------------------------------------------------------------------》
//《-----------------------------------------------------------------------------------------》
// 下面就是中间件
2023-06-13 12:09:32 +08:00
//使用全局异常中间件
app.UseMiddleware<GlobalExceptionMiddleware>();
2022-05-19 18:34:52 +08:00
2022-03-06 14:26:05 +08:00
app.Use((context, next) =>
{
//设置可以多次获取body内容
2022-03-06 14:26:05 +08:00
context.Request.EnableBuffering();
if (context.Request.Query.TryGetValue("access_token", out var token))
{
context.Request.Headers.Add("Authorization", $"Bearer {token}");
}
return next();
});
2022-06-01 17:46:35 +08:00
//开启访问静态文件/wwwroot目录文件要放在UseRouting前面
2022-03-06 14:26:05 +08:00
app.UseStaticFiles();
2022-06-01 17:46:35 +08:00
//开启路由访问
2022-03-06 14:26:05 +08:00
app.UseRouting();
2022-06-01 17:46:35 +08:00
app.UseCors("Policy");//要放在app.UseEndpoints前。
2022-03-06 14:26:05 +08:00
//app.UseHttpsRedirection();
2023-08-02 13:36:44 +08:00
//todo 认证
2022-03-06 14:26:05 +08:00
app.UseAuthentication();
2023-08-02 13:36:44 +08:00
//todo 授权
2022-03-06 14:26:05 +08:00
app.UseAuthorization();
2024-01-04 09:01:03 +08:00
//开启缓存 ????
2022-03-06 14:26:05 +08:00
app.UseResponseCaching();
if (builder.Environment.IsProduction())
{
//恢复/启动任务
app.UseAddTaskSchedulers();
}
2023-06-13 12:09:32 +08:00
//使用swagger
app.UseSwagger();
2023-05-12 15:08:24 +08:00
//启用客户端IP限制速率
app.UseIpRateLimiting();
app.UseRateLimiter();
2022-11-18 13:26:39 +08:00
//设置socket连接
app.MapHub<MessageHub>("/msgHub");
2023-12-01 15:39:07 +08:00
2022-11-18 13:26:39 +08:00
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
2022-03-06 14:26:05 +08:00
app.MapControllers();
app.Run();