176 lines
7.5 KiB
C#
Raw Normal View History

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();
2024-08-01 10:55:51 +08:00
//全局配置
2024-05-16 13:30:30 +08:00
InternalApp.ServiceProvider = app.Services;
InternalApp.Configuration = builder.Configuration;
InternalApp.WebHostEnvironment = app.Environment;
2024-08-01 10:55:51 +08:00
//初始化db和 配置sqlsugar 然后注入IOC容器然后AOP配置
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-12-21 15:53:01 +08:00
var fileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.WebRootPath, "device"));
var requestPath = "/devices";
2024-06-18 10:53:54 +08:00
2024-12-21 15:53:01 +08:00
// Enable displaying browser links.
2024-06-18 10:53:54 +08:00
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = requestPath
});
2024-12-21 15:53:01 +08:00
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(InternalApp.Configuration.GetSection("Upload").GetSection("rootDirectory").Get<string>())
});
2024-06-18 10:53:54 +08:00
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();