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