Files
shgx_tz_mes_backend_sync/ZR.Admin.WebApi/Program.cs
2025-12-21 15:42:34 +08:00

187 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AspNetCoreRateLimit;
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.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>();
// 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", 2325); // 你可以按需修改 IP 和端口
server.Start(); // 项目启动时立即启动监听
//server.StartReceiving();
return server;
});
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();