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 ;
using NLog.Web ;
using System.Text.Json ;
using ZR.Admin.WebApi.Extensions ;
using ZR.Common.Cache ;
using ZR.Infrastructure.WebExtensions ;
using ZR.ServiceCore.Signalr ;
using ZR.ServiceCore.SqlSugar ;
var builder = WebApplication . CreateBuilder ( args ) ;
// NLog: Setup NLog for Dependency injection
//builder.Logging.ClearProviders();
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 ( ) ;
//注入HttpContextAccessor
builder . Services . AddSingleton < IHttpContextAccessor , HttpContextAccessor > ( ) ;
// 跨域配置
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-05-16 13:30:30 +08:00
//builder.Services.AddSession();
builder . Services . AddHttpContextAccessor ( ) ;
//绑定整个对象到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 ( ) ;
var app = builder . Build ( ) ;
InternalApp . ServiceProvider = app . Services ;
InternalApp . Configuration = builder . Configuration ;
InternalApp . WebHostEnvironment = app . Environment ;
//初始化db
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前面
app . UseStaticFiles ( ) ;
//开启路由访问
app . UseRouting ( ) ;
app . UseCors ( "Policy" ) ; //要放在app.UseEndpoints前。
//app.UseHttpsRedirection();
app . UseAuthentication ( ) ;
app . UseAuthorization ( ) ;
//开启缓存
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 ( ) ;