202 lines
7.0 KiB
C#
202 lines
7.0 KiB
C#
using AspNetCoreRateLimit;
|
||
using Infrastructure.Helper;
|
||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||
using Microsoft.AspNetCore.DataProtection;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
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;
|
||
|
||
var builder = WebApplication.CreateBuilder(args);
|
||
//后台定时任务
|
||
builder.Services.AddHostedService<ScheduledBackgroundService>();
|
||
builder.Services.AddHostedService<SocketBackgroundService>();
|
||
|
||
|
||
// 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<IHttpContextAccessor, HttpContextAccessor>();
|
||
// 注册MyMqttConfig(依赖ILogger和IConfiguration)
|
||
builder.Services.AddSingleton<MyMqttConfig>();
|
||
// 注册MqttService为单例服务,并作为后台服务运行 !!!! 这样注册就行了 ================
|
||
builder.Services.AddSingleton<MqttService>();
|
||
builder.Services.AddHostedService(sp => sp.GetRequiredService<MqttService>());
|
||
/// ===============================================================================
|
||
// 跨域配置
|
||
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<OptionsSetting>(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<ApiBehaviorOptions>((o) =>
|
||
{
|
||
o.SuppressModelStateInvalidFilter = true;
|
||
});
|
||
// 注册 SocketGatewayServer 为 Singleton(单例,整个应用生命周期一个实例)
|
||
//手表通知配置
|
||
builder.Services.AddSingleton<SocketGatewayServer>(provider =>
|
||
{
|
||
var server = new SocketGatewayServer("192.168.1.56", 8877); // 你可以按需修改 IP 和端口
|
||
server.Start(); // 项目启动时立即启动监听
|
||
//server.StartReceiving();
|
||
|
||
return server;
|
||
});
|
||
//三色灯网关IP配置
|
||
builder.Services.AddSingleton<ModbusTcpClientHelper>(provider =>
|
||
{
|
||
var modbus = new ModbusTcpClientHelper();
|
||
|
||
modbus.Connect("192.168.1.200", 9999); // 你可以按需修改 IP 和端口
|
||
|
||
|
||
return modbus;
|
||
});
|
||
var app = builder.Build();
|
||
InternalApp.ServiceProvider = app.Services;
|
||
InternalApp.Configuration = builder.Configuration;
|
||
InternalApp.WebHostEnvironment = app.Environment;
|
||
//初始化db
|
||
builder.Services.AddDb(builder.Configuration, app.Environment);
|
||
|
||
|
||
//《-----------------------------------------------------------------------------------------》
|
||
//《-----------------------------------------------------------------------------------------》
|
||
//《-----------------------------------------------------------------------------------------》
|
||
//《-----------------------------------------------------------------------------------------》
|
||
//《-----------------------------------------------------------------------------------------》
|
||
//《-----------------------------------------------------------------------------------------》
|
||
// 下面就是中间件
|
||
|
||
//使用全局异常中间件
|
||
app.UseMiddleware<GlobalExceptionMiddleware>();
|
||
|
||
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<MessageHub>("/msgHub");
|
||
|
||
|
||
app.MapControllerRoute(
|
||
name: "default",
|
||
pattern: "{controller=Home}/{action=Index}/{id?}");
|
||
|
||
app.MapControllers();
|
||
|
||
app.Run(); |