Zr.Admin项目Program.cs配置项解析

打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
using AspNetCoreRateLimit;
using Infrastructure.Converter;
using Microsoft.AspNetCore.DataProtection;
using NLog.Web;
using SqlSugar;
using System.Text.Json;
using ZR.Admin.WebApi.Extensions;
using ZR.Common.Cache;
using ZR.Common.DynamicApiSimple.Extens;
using ZR.Infrastructure.WebExtensions;
using ZR.ServiceCore.Signalr;
using ZR.ServiceCore.SqlSugar;
// WebApplication表示整个Web, 创建WebApplicationBuilder,用于配置和构建 ASP.NET Core 应用程序
var builder = WebApplication.CreateBuilder(args);
// Host 是 builder 的一个属性,表示应用程序的主机配置。主机是 ASP.NET Core 应用程序的焦点,负责管理应用程序的生命周期、依赖注入、配置等。
// 将 NLog 日志框架集成到 ASP.NET Core 应用程序中
builder.Host.UseNLog();
// 注入项目中的程序集。如ZR.Model等
// Services 是 builder 的一个属性,表示应用程序的服务容器。
// 通过 Services,可以向应用程序注册各种服务,这些服务可以在应用程序的其他部分通过依赖注入(Dependency Injection)来使用
builder.Services.AddDynamicApi();
// 向 ASP.NET Core 应用程序的服务容器注册 MVC 控制器及其相关服务。这使得应用程序可以或许处理 HTTP 请求,并通过控制器方法返回相应的 HTTP 相应
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
// 向 ASP.NET Core 应用程序的服务容器注册与 API 闭幕点相关的服务。这些服务用于生成 API 的元数据信息,通常用于生成 API 文档(如 Swagger/OpenAPI)
builder.Services.AddEndpointsApiExplorer();
// 向 ASP.NET Core 应用程序的服务容器注册 Swagger 生成器服务。它可以根据应用程序中的 API 闭幕点自动生成 OpenAPI 规范
builder.Services.AddSwaggerGen();
//注入HttpContextAccessor
// 将 HttpContextAccessor 注册为 IHttpContextAccessor 接口的单例服务
// 由于使用了 AddSingleton,HttpContextAccessor 实例在应用程序的整个生命周期内只会创建一次,并在所有请求中共享
// 应用程序的任何地方方便地访问当前 HTTP 请求的上下文信息,比方:比方在服务层或中间件中获取请求头、用户身份等信息
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// 跨域配置 安全地处理来自不同域的请求,从而实现跨域资源共享,对应appsettings.json文件中的 corsUrls 配置项
// 向 ASP.NET Core 应用程序的服务容器注册跨域资源共享(CORS)服务
// 允许网页从不同的域(域名、协议或端口)请求资源。默认情况下,浏览器会制止跨域请求,CORS 提供了一种安全的方式来允许这些请求
// builder.Configuration 是 IConfiguration 的实例,表示应用程序的配置。它通常用于从 appsettings.json 文件、情况变量、下令行参数等来源读取配置信息
// builder.Configuration 被转达给 AddCors 方法,以便从配置文件中读取 CORS 相关的设置
builder.Services.AddCors(builder.Configuration);
//消除Error unprotecting the session cookie警告
// AddDataProtection用于配置数据保护服务的方法。数据保护服务主要用于加密和解密敏感数据,比方身份验证令牌、Cookie 等。
// 通过调用 AddDataProtection 方法,应用程序可以启用数据保护功能,确保敏感数据在存储或传输过程中得到保护
builder.Services.AddDataProtection()
    // 在应用程序当前目次下的 DataProtection 子目次,将数据保护密钥将存储在该目次中
    // 默认情况下,ASP.NET Core 的数据保护密钥存储在内存中,这意味着如果应用程序重启,密钥会丢失,导致无法解密之前加密的数据。通过 PersistKeysToFileSystem 方法,可以将密钥长期化到文件体系中,确保即使应用程序重启,密钥仍然可用
    .PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "DataProtection"));
//普通验证码
// 注入Lazy.Captcha 验证码服务,对应appsettings.json文件中的 CaptchaOptions 配置项
builder.Services.AddCaptcha(builder.Configuration);
//IPRatelimit
// 注入 IP 请求限制服务,对应appsettings.json文件中的 IpRateLimiting、IpRateLimitPolicies 配置项
builder.Services.AddIPRate(builder.Configuration);
// 注入 HttpContextAccessor 服务
// HttpContextAccessor 是一个类,它提供了对当前 HTTP 请求的 HttpContext 的访问。HttpContext 包含了与当前 HTTP 请求相关的所有信息,如请求头、查询参数、用户身份等
builder.Services.AddHttpContextAccessor();
//绑定整个对象到Model上
// 将 appsettings.json配置项绑定到OptionsSetting 中。通过这种方式,应用程序可以在运行时轻松访问和使用这些配置选项,而不需要手动解析配置文件
builder.Services.Configure<OptionsSetting>(builder.Configuration);
// 将 codeGen.json 文件添加到应用程序的配置源中。这样,应用程序可以通过 IConfiguration 接口访问 codeGen.json 文件中的配置项,比方 builder.Configuration["SomeKey"] 来获取特定的配置值
builder.Configuration.AddJsonFile("codeGen.json");
builder.Configuration.AddJsonFile("iprate.json");
//jwt 认证
builder.Services.AddJwt();
//配置文件
// 将 AppSettings 类注册为 ASP.NET Core 应用程序的单例服务,并将应用程序的配置信息(通过 builder.Configuration)转达给 AppSettings 的构造函数。这样,应用程序的其他部分可以通过依赖注入来访问 AppSettings 实例,并使用其中的配置信息
builder.Services.AddSingleton(new AppSettings(builder.Configuration));
//app服务注册
// 注册引用程序域中所有有AppService标记的类的服务
// 这简化了服务注册的过程,避免了手动逐个注册服务的繁琐操纵。通过这种方式,开辟者可以更专注于业务逻辑的实现,而不必过多关注服务的注册和依赖注入的配置
builder.Services.AddAppService();
//开启计划使命
builder.Services.AddTaskSchedulers();
//请求巨细限制
// 请求body巨细设置,对应appsettings.json文件中的 upload:requestLimitSize 配置项
builder.Services.AddRequestLimit(builder.Configuration);
//注册REDIS 服务
var openRedis = builder.Configuration["RedisServerpen"];
if (openRedis == "1")
{
    RedisServer.Initalize();
}
// 向容器中添加 MVC 服务,这使得应用程序可以或许处理 HTTP 请求并在控制器中返回相应的相应
builder.Services.AddMvc(options =>
{
    // 为 MVC 应用程序注册过滤器 GlobalActionMonitor,处理参数校验、请求监控等功能
    options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
})
// 配置 JSON 序列化选项
.AddJsonOptions(options =>
{
    // 该选项设置 JSON 输出为格式化模式,意味着生成的 JSON 字符串将使用缩进和换行,使其更易于阅读。这在调试或查看 JSON 返回值时非常有效。
    options.JsonSerializerOptions.WriteIndented = true;
    // 日期格式化
    options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
    // 时间格式化
    options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
    // 字符串格式化
    options.JsonSerializerOptions.Converters.Add(new StringConverter());
    //PropertyNamingPolicy属性用于前端传过来的属性的格式策略,现在内置的仅有一种策略CamelCase
    // 设置属性定名策略为驼峰定名(CamelCase)。这意味着在序列化时,所有属性名称都会以小写字母开头,符合 JavaScript 的常用风格。比方,C# 的 property FirstName 在 JSON 中将被序列化为 firstName
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    //options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;//属性可以忽略巨细写格式,开启后性能会低落
});
//注入SignalR实时通讯,默认用json传输
builder.Services.AddSignalR()
// 配置SignalR所使用的JSON序列化协议
.AddJsonProtocol(options =>
{
    options.PayloadSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});
// 注册 Swagger 配置,包罗了 API 文档的生成、描述信息的设置等
builder.Services.AddSwaggerConfig();
// 显示logo
// 项目启动时的控制台打印信息
builder.Services.AddLogo();
// 将配置的服务和中间件组合成一个可运行的 WebApplication 实例
// 应用程序整合了之前在构建阶段所添加的所有服务和中间件,为处理 HTTP 请求做预备。
// 这是 ASP.NET Core 生命周期中的一个重要步骤,因为在调用 app.Run() 之前,需要先构建这个应用实例,之后才能执行请求处理逻辑
var app = builder.Build();
// InternalApp 可以方便地获取和使用应用程序中注册的各类服务
InternalApp.ServiceProvider = app.Services;
InternalApp.Configuration = builder.Configuration;
InternalApp.WebHostEnvironment = app.Environment;
//初始化db
// 如果appsettings.json中配置了initDb 为true,在开辟情况则初始化数据库,否则不初始化
builder.Services.AddDb(app.Environment);
// 从配置文件中读取的 workId 赋值给 SnowFlakeSingle 类的 WorkId 属性。
// 这样做的目标是为当前应用程序实例设置一个唯一的工作节点ID,确保在使用Snowflake算法生成ID时,生成的ID是全局唯一的
var workId = builder.Configuration["workId"].ParseToInt();
if (app.Environment.IsDevelopment())
{
    workId += 1;
}
SnowFlakeSingle.WorkId = workId;
//使用全局异常中间件
// 通过将 GlobalExceptionMiddleware 添加到管道中,可以在请求处理过程中捕捉任何未处理的异常,并进行同一的处理(如记录日志、返回友好的错误信息等)
app.UseMiddleware<GlobalExceptionMiddleware>();
//请求头转发
// 当应用程序部署在反向代理(如 Nginx、IIS、Apache 等)背面时,客户端的原始请求信息(如 IP 地址、协议等)会被代理服务器修改。
// 反向代理服务器通常会将原始信息通过特定的请求头(如 X-Forwarded-For 和 X-Forwarded-Proto)转达给应用程序
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    //ForwardedHeaders中间件会自动把反向代理服务器转发过来的X-Forwarded-For(客户端真实IP)以及X-Forwarded-Proto(客户端请求的协议)自动填充到HttpContext.Connection.RemoteIPAddress和HttpContext.Request.Scheme中,这样应用代码中读取到的就是真实的IP和真实的协议了,不需要应用做特殊处理。
    ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto
});
// 用于向请求处理管道中添加当前 HTTP 请求的上下文对象(HttpContext),包含了请求和相应的所有信息
app.Use((context, next) =>
{
    //设置可以多次获取body内容
    // 启用请求体的缓冲功能。默认情况下,ASP.NET Core 的请求体只能读取一次。通过调用 EnableBuffering,
    // 可以将请求体缓冲到内存或磁盘中,从而允许多次读取请求体内容。
    // 这对于需要在多个地方处理请求体(比方日志记录、验证、业务逻辑等)的场景非常有效
    context.Request.EnableBuffering();
    if (context.Request.Query.TryGetValue("access_token", out var token))
    {
        context.Request.Headers.Add("Authorization", $"Bearer {token}");
    }
    // 调用 next 委托,将请求转达给管道中的下一个中间件进行处理。
    // 这是中间件的关键部分,确保请求可以或许继续向下转达,而不是在当前中间件停止
    return next();
});
//开启访问静态文件/wwwroot目次文件,要放在UseRouting前面
app.UseStaticFiles();
//开启路由访问
// 它负责将传入的 HTTP 请求映射到相应的控制器和操纵方法
app.UseRouting();
// 启用跨域资源共享(CORS)策略,并确保它在路由处理之宿世效
app.UseCors("olicy");//要放在app.UseEndpoints前。
// 启用身份验证的关键中间件。它负责解析和验证请求中的身份验证信息,并将用户信息附加到请求上下文中,为后续的授权和业务逻辑处理提供基础
app.UseAuthentication();
// 启用授权的中间件。它负责检查当前用户是否有权限访问当前请求的资源,并根据授权策略来决定是否允许访问
app.UseAuthorization();
//开启缓存
// 启用 ASP.NET Core 应用程序的相应缓存功能。它通过在请求处理管道中添加一个中间件,缓存 HTTP 相应,从而减少服务器负载、进步相应速度,并优化应用程序的性能
app.UseResponseCaching();
if (builder.Environment.IsProduction())
{
    //恢复/启动使命
    // 程序启动后添加使命计划
    app.UseAddTaskSchedulers();
}
//初始化字典数据
app.UseInit();
//使用swagger
app.UseSwagger();
//启用客户端IP限制速率
app.UseIpRateLimiting();
app.UseRateLimiter();
//设置socket毗连
app.MapHub<MessageHub>("/msgHub");
// 注册 MVC 控制器路由,它将请求映射到控制器的特定操纵方法上。
// 路由模板“{controller=Home}/{action=Index}/{id?}”表示:
// 如果控制器名称未指定,则使用默认的控制器(HomeController);
// 如果操纵名称未指定,则使用默认的操纵(Index);
// 如果 URL 中没有提供 ID,则忽略该参数。
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
// 所有已注册的控制器及其路由映射到应用程序的请求处理管道中
app.MapControllers();
// 启动应用程序
app.Run();

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表