Files
zszq-trs/YLErpWeb/Program.cs
T
2024-05-09 14:06:26 +08:00

222 lines
8.7 KiB
C#

using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.WebEncoders;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using NLog;
using NLog.Web;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using YieldChain.Commons;
using YLErp.Abstract;
using YLErp.Modules.SwapModule;
using YLErp.Modules.SwapModule.Interface;
using YLErp.Web.App;
using YLErp.Web.App.KafkaTask;
using YLErp.Web.Hubs;
JsonConvert.DefaultSettings = JsonHelper.GetDefaultSettings;
var logger = NLog.LogManager.Setup().GetCurrentClassLogger();
logger.Debug("init main");
try
{
var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;
// Add services to the container.
builder.Services.AddHttpClient();
builder.Services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.Converters.Add(new AntiXssConverter());
options.JsonSerializerOptions.Converters.Add(YLErp.Serialization.CustomDoubleConvert.Default);
options.JsonSerializerOptions.Converters.Add(new YLErp.Serialization.CustomDateTimeConverter());
}).AddRazorRuntimeCompilation();
//视图渲染绑定中文乱码问题
builder.Services.Configure<WebEncoderOptions>(options => options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All));
builder.Services.Configure<FormOptions>(options =>
{
options.ValueCountLimit = 1000000;
options.ValueLengthLimit = 1024 * 1024 * 100; // 100MB max len form data
options.MultipartBodyLengthLimit = int.MaxValue; //不限制文件上传大小
});
builder.Services.Configure<KafkaConfig>(builder.Configuration.GetSection("KafkaConfig"));
builder.Services.AddScoped<IViewRenderService, ViewRenderService>();
builder.Services.AddSingleton<IKafkaProduce, KafkaProduceHelper>();
builder.Services.AddSingleton<IPushHTService, PushHTService>();
builder.Services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
});
builder.Services.AddAuthentication(AuthHelper.CookieAuthType)
.AddCookie(AuthHelper.CookieAuthType, options =>
{
options.LoginPath = "/Account/Login/";
options.AccessDeniedPath = "/Account/Login/";
options.ExpireTimeSpan = TimeSpan.FromSeconds(AuthHelper.ExpireInSeconds);
options.SlidingExpiration = true;
})
.AddJwtBearer(AuthHelper.JwtAuthType, options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = true, //是否验证失效时间
ClockSkew = TimeSpan.FromSeconds(AuthHelper.ExpireInSeconds),
ValidateAudience = false,
ValidateIssuer = false, //是否验证Issuer
ValidateIssuerSigningKey = true, //是否验证SecurityKey
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthHelper.JwtSecretKey))
};
});
builder.Services.AddAuthorization(options =>
{
options.AddPolicy(AuthHelper.CookieAuthType, policy => policy.RequireAssertion(context => ErpAuthorizeHandler.Default.Handle(context)));
options.AddPolicy(AuthHelper.JwtAuthType, policy => policy.RequireAssertion(context => ErpAuthorizeHandler.Default.Handle(context)));
});
//NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();
builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
builder.Host.UseNLog();
// Save IServerCollection
YLServiceLocator.SetServiceCollection(builder.Services);
Server.Initialize(builder.Environment, builder.Configuration);
Startup.Start(builder.Configuration);
builder.Services.AddHostedService<SendKafkaTask>();
builder.Services.AddHostedService<ClientBalanceTask>();
//builder.Services.AddHostedService<SwapTradeProduceKafkaTask>();
builder.Services.AddHostedService<SwapTradeConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeMarginConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradePosiConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeUnwindConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeReceiptConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeCashReceiptConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeMarginReceiptConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradePosiReceiptConsumerKafkaTask>();
builder.Services.AddHostedService<SwapTradeUnwindReceiptConsumerKafkaTask>();
//builder.Services.AddHostedService<ClientInfoProduceKafkaTask>();
builder.Services.AddHostedService<ClientInfoConsumerKafkaTask>();
builder.Services.AddHostedService<ClientBankConsumerKafkaTask>();
builder.Services.AddHostedService<ClientReskCheckKafkaTask>();
builder.Services.AddHostedService<YLErp.Web.App.HostedTaskService>();
builder.Services.AddHostedService<ClientBalanceMonitorTotalKafkaTask>();
builder.Services.AddHostedService<ClientBalanceMonitorSingleKafkaTask>();
builder.Services.AddHostedService<ExchangeTradeConsumerKafkaTask>();
builder.Services.AddHostedService<TrsExchangeTradeConsumerKafkaTask>();
builder.Services.AddHostedService<HedgingOrderCancelConsumerKafkaTask>();
builder.Services.AddHostedService<CashCalcConsumerKafkaTask>();
builder.Services.AddHostedService<CashNoticeConsumerKafkaTask>();
builder.Services.AddHostedService<HolidayConsumerKafkaTask>();
builder.Services.AddCaptcha(builder.Configuration, option =>
{
option.ImageOption.Width = 256; // 验证码宽度
option.ImageOption.Height = 34; // 验证码高度
option.ExpirySeconds = 60; // 验证码过期时间
option.IgnoreCase = true; // 比较时是否忽略大小写
option.ImageOption.BubbleCount = 0;
option.ImageOption.InterferenceLineCount = 3; // 干扰线数量
});
builder.Services.AddSignalR();
//============================================
var app = builder.Build();
// Save IServerProvider
YLServiceLocator.SetServiceProvider(app.Services);
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
}
app.UseMiddleware<ExceptionMiddleware>();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
// Linux 路径区分大小写,需要对静态文件做处理
app.UseMiddleware<StaticUrlMiddleware>();
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SwapFlowCombookingHub>("/swapflow/combookinghub"); // 映射Hub路径
endpoints.MapHub<SwapFlowResetHub>("/swapflow/resethub"); // 映射Hub路径
});
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".pdf"] = "application/pdf";
provider.Mappings[".doc"] = "application/msword";
provider.Mappings[".docx"] = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
provider.Mappings[".xls"] = "application/vnd.ms-excel";
provider.Mappings[".xlsx"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Server.MapPath("App_Docs")),
RequestPath = "/App_Docs",
ContentTypeProvider = provider
});
app.UseResponseCompression();
app.MapAreaControllerRoute(
name: "MyAreaAdmin",
areaName: "Admin",
pattern: "Admin/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "mapi",
pattern: "m/api/{*path}");
app.MapControllerRoute(
name: "v3",
pattern: "v3/{*path}",
new { controller = "V3", action = "Index" });
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
}
catch (Exception ex)
{
// NLog: catch setup errors
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}