2024-05-31 13:40:00 +08:00
using AspNetCoreRateLimit ;
2024-05-16 13:30:30 +08:00
using Infrastructure.Converter ;
2024-05-31 13:40:00 +08:00
using Microsoft.AspNetCore.Builder ;
2024-05-16 13:30:30 +08:00
using Microsoft.AspNetCore.DataProtection ;
2024-06-18 10:53:54 +08:00
using Microsoft.Extensions.FileProviders ;
2024-05-16 13:30:30 +08:00
using NLog.Web ;
using System.Text.Json ;
2024-07-01 16:04:10 +08:00
using DOAN.Admin.WebApi.Extensions ;
using DOAN.Common.Cache ;
using DOAN.Infrastructure.WebExtensions ;
using DOAN.ServiceCore.Signalr ;
using DOAN.ServiceCore.SqlSugar ;
2024-07-22 15:12:00 +08:00
using Infrastructure ;
2024-05-16 13:30:30 +08:00
var builder = WebApplication . CreateBuilder ( args ) ;
2024-07-22 15:12:00 +08:00
2024-05-16 13:30:30 +08:00
builder . Host . UseNLog ( ) ;
// Add services to the container.
builder . Services . AddControllers ( ) ;
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder . Services . AddEndpointsApiExplorer ( ) ;
builder . Services . AddSwaggerGen ( ) ;
2024-07-05 16:55:06 +08:00
//注入HttpContextAccessor TODO 这地方就是配置httpcontext https://blog.csdn.net/iqifenxia/article/details/121740805
//builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder . Services . AddHttpContextAccessor ( ) ;
/ *
在 ASP . NET Core中 , ` IHttpContextAccessor ` 是 用 于 访 问 HTTP请求上下文的接口 , 而 ` HttpContextAccessor ` 是 ` IHttpContextAccessor ` 接 口 的 一 个 默 认 实 现 。
区 别 在 于 :
1. ` Services . AddSingleton < IHttpContextAccessor , HttpContextAccessor > ( ) ` 会 将 ` HttpContextAccessor ` 注 册 为 ` IHttpContextAccessor ` 接 口 的 实 现 , 并 使 用 单 例 模 式 ( singleton ) 将 实 例 注 册 到 应 用 程 序 中 。 这 意 味 着 在 整 个 应 用 程 序 生 命 周 期 中 , 只 会 有 一 个 ` HttpContextAccessor ` 实 例 被 创 建 并 共 享 。
2. ` Services . AddHttpContextAccessor ( ) ` 是 ASP . NET Core提供的一种快捷方法 , 会 将 ` HttpContextAccessor ` 注 册 为 ` IHttpContextAccessor ` 接 口 的 默 认 实 现 , 并 采 用 Scoped生命周期 。 Scoped生命周期意味着在同一个请求范围内 , 每 次 请 求 都 会 创 建 一 个 新 的 ` HttpContextAccessor ` 实 例 , 并 在 请 求 结 束 时 销 毁 。
通 常 建 议 使 用 ` Services . AddHttpContextAccessor ( ) ` 来 注 册 ` HttpContextAccessor ` , 因 为 它 是 ASP . NET Core的标准做法 , 而 且 会 自 动 处 理 实 例 的 生 命 周 期 管 理 。
希 望 这 个 解 释 对 您 有 帮 助 ! 如 果 您 有 任 何 其 他 问 题 , 请 随 时 告 诉 我 。
* /
2024-05-16 13:30:30 +08:00
// 跨域配置
builder . Services . AddCors ( builder . Configuration ) ;
// 显示logo
builder . Services . AddLogo ( ) ;
//消除Error unprotecting the session cookie警告
builder . Services . AddDataProtection ( )
. PersistKeysToFileSystem ( new DirectoryInfo ( Directory . GetCurrentDirectory ( ) + Path . DirectorySeparatorChar + "DataProtection" ) ) ;
//普通验证码
builder . Services . AddCaptcha ( builder . Configuration ) ;
//IPRatelimit
2024-05-31 13:40:00 +08:00
builder . Services . AddIPRate ( builder . Configuration ) ;
2024-05-31 13:40:00 +08:00
2024-07-05 16:55:06 +08:00
//builder.Services.AddSession();
2024-05-16 13:30:30 +08:00
//绑定整个对象到Model上
builder . Services . Configure < OptionsSetting > ( builder . Configuration ) ;
//jwt 认证
builder . Services . AddJwt ( ) ;
//配置文件
builder . Services . AddSingleton ( new AppSettings ( builder . Configuration ) ) ;
//app服务注册
builder . Services . AddAppService ( ) ;
//开启计划任务
builder . Services . AddTaskSchedulers ( ) ;
//注册REDIS 服务
var openRedis = builder . Configuration [ "RedisServer:open" ] ;
if ( openRedis = = "1" )
{
RedisServer . Initalize ( ) ;
}
builder . Services . AddMvc ( options = >
{
options . Filters . Add ( typeof ( GlobalActionMonitor ) ) ; //全局注册 过滤器 这边就是 The paramter field is required. | The partnumber field is required. | The workstation field is required."
} )
. 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 . Converters . Add ( new StringConverter ( ) ) ;
//PropertyNamingPolicy属性用于前端传过来的属性的格式策略, 目前内置的仅有一种策略CamelCase
options . JsonSerializerOptions . PropertyNamingPolicy = JsonNamingPolicy . CamelCase ;
//options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;//属性可以忽略大小写格式,开启后性能会降低
} ) ;
//注入SignalR实时通讯, 默认用json传输
builder . Services . AddSignalR ( )
. AddJsonProtocol ( options = >
{
options . PayloadSerializerOptions . PropertyNamingPolicy = JsonNamingPolicy . CamelCase ;
} ) ;
builder . Services . AddSwaggerConfig ( ) ;
2024-06-18 10:53:54 +08:00
builder . Services . AddDirectoryBrowser ( ) ;
2024-05-16 13:30:30 +08:00
var app = builder . Build ( ) ;
InternalApp . ServiceProvider = app . Services ;
InternalApp . Configuration = builder . Configuration ;
InternalApp . WebHostEnvironment = app . Environment ;
2024-07-22 15:12:00 +08:00
//初始化db sqlsugar
2024-05-16 13:30:30 +08:00
builder . Services . AddDb ( app . Environment ) ;
//使用全局异常中间件
app . UseMiddleware < GlobalExceptionMiddleware > ( ) ;
//请求头转发
//ForwardedHeaders中间件会自动把反向代理服务器转发过来的X-Forwarded-For( 客户端真实IP) 以及X-Forwarded-Proto( 客户端请求的协议) 自动填充到HttpContext.Connection.RemoteIPAddress和HttpContext.Request.Scheme中, 这样应用代码中读取到的就是真实的IP和真实的协议了, 不需要应用做特殊处理。
app . UseForwardedHeaders ( new ForwardedHeadersOptions
{
ForwardedHeaders = Microsoft . AspNetCore . HttpOverrides . ForwardedHeaders . XForwardedFor | Microsoft . AspNetCore . HttpOverrides . ForwardedHeaders . XForwardedProto
} ) ;
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前面
2024-06-18 10:53:54 +08:00
var fileProvider = new PhysicalFileProvider ( Path . Combine ( builder . Environment . WebRootPath , "device" ) ) ;
var requestPath = "/devices" ;
// Enable displaying browser links.
app . UseStaticFiles ( new StaticFileOptions
{
FileProvider = fileProvider ,
RequestPath = requestPath
} ) ;
app . UseStaticFiles ( new StaticFileOptions
{
FileProvider = new PhysicalFileProvider ( InternalApp . Configuration . GetSection ( "Upload" ) . GetSection ( "rootDirectory" ) . Get < string > ( ) )
} ) ;
app . UseDirectoryBrowser ( new DirectoryBrowserOptions
{
FileProvider = fileProvider ,
RequestPath = requestPath
} ) ;
2024-05-16 13:30:30 +08:00
//开启路由访问
app . UseRouting ( ) ;
app . UseCors ( "Policy" ) ; //要放在app.UseEndpoints前。
//app.UseHttpsRedirection();
2024-07-22 15:12:00 +08:00
// 认证 这意味着对于每一个进入应用的HTTP请求, 框架都会尝试从请求中提取身份验证信息( 如JWT token、cookies或其他身份验证机制提供的信息) , 并根据这些信息来创建或更新当前用户的身份信息( ClaimsPrincipal) 。如果请求中包含了有效的身份验证凭据, 那么用户将被认为是已认证的。
2024-05-16 13:30:30 +08:00
app . UseAuthentication ( ) ;
2024-07-22 15:12:00 +08:00
//授权 在app.UseAuthentication(); 之后调用的 app.UseAuthorization(); 则是启用授权功能。当授权中间件被调用时,它会检查请求上的[Authorize] 属性或其他策略,以确定用户是否有权限访问特定的资源或执行特定的操作。
app . UseAuthorization ( ) ; //授权
2024-05-16 13:30:30 +08:00
//开启缓存
app . UseResponseCaching ( ) ;
if ( builder . Environment . IsProduction ( ) )
{
//恢复/启动任务
app . UseAddTaskSchedulers ( ) ;
}
//使用swagger
app . UseSwagger ( ) ;
//启用客户端IP限制速率
2024-05-31 13:40:00 +08:00
app . UseIpRateLimiting ( ) ;
app . UseRateLimiter ( ) ;
2024-05-16 13:30:30 +08:00
//设置socket连接
app . MapHub < MessageHub > ( "/msgHub" ) ;
app . MapControllerRoute (
name : "default" ,
pattern : "{controller=Home}/{action=Index}/{id?}" ) ;
app . MapControllers ( ) ;
app . Run ( ) ;