using IES.ExamServer.DI; using IES.ExamServer.DI.SignalRHost; using IES.ExamServer.Filters; using Microsoft.AspNetCore.StaticFiles; using NLog.Extensions.Logging; using SkiaSharp; using System.Drawing; using System.Text; using System.Text.Encodings.Web; using System.Text.Unicode; using static System.Net.Mime.MediaTypeNames; using System.Diagnostics; using System.Security.Authentication; namespace IES.ExamServer.Server { public class Program { public async static Task Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.WebHost.ConfigureKestrel(serverOptions => { // 配置支持的 SSL/TLS 协议版本 serverOptions.ConfigureHttpsDefaults(httpsOptions => { httpsOptions.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13; }); }); string path = $"{builder.Environment.ContentRootPath}/Configs"; // Add services to the container. builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); // Add services to the container. builder.Services.AddControllersWithViews().AddJsonOptions(options => { // 设置 JSON 序列化选项 options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 允许所有 Unicode 字符 options.JsonSerializerOptions.WriteIndented = true; // 格式化输出(可选) }); builder.Services.AddHttpClient(); builder.Services.AddSignalR(); builder.Services.AddHttpContextAccessor(); //此处能在Linux及MacOS运行, //Windows的路径是LocalApplicationData Path: C:\Users\john\AppData\Local //Linux的路径是LocalApplicationData Path: /home/john/.local/share, //MacOS 的路径LocalApplicationData Path: /Users/john/Library/Application Support string localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); //string dbpath = $"{localAppDataPath}\\ExamServer\\LiteDB"; string dbpath = Path.Combine(localAppDataPath, "ExamServer", "LiteDB"); if (!System.IO.Directory.Exists(dbpath)) { System.IO.Directory.CreateDirectory(dbpath); } string liteDBPath = $"Filename={dbpath}/data.db;Connection=shared"; var connections_LiteDB = new List { new LiteDBFactoryOptions { Name = "Master", Connectionstring = liteDBPath} }; builder.Services.AddLiteDB(connections_LiteDB); builder.Services.AddMemoryCache(); // 注册 ConnectionService 为单例 builder.Services.AddSingleton(); builder.Services.AddSingleton(); // 注册 DataQueue 服务 builder.Services.AddSingleton(); // 注册后台服务 builder.Services.AddHostedService(); builder.Services.AddCors(options => { //options.AddDefaultPolicy( //builder => //{ // builder.AllowAnyOrigin() // .AllowAnyHeader() // .AllowAnyMethod(); //}); options.AddPolicy("any", builder => { //builder.SetIsOriginAllowed(x => true) //.AllowAnyMethod() //.AllowAnyHeader() //.AllowCredentials(); builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); builder.Services.AddMvcFilter(); // 添加自定义日志提供程序 //builder.Logging.ClearProviders(); //bool enableConsoleOutput = true; //builder.Logging.AddProvider(new CustomFileLoggerProvider(Path.Combine(Directory.GetCurrentDirectory(), "Logs"), enableConsoleOutput)); // 添加日志服务 builder.Logging.ClearProviders(); builder.Logging.AddNLog(); builder.Services.AddHostedService(); var app = builder.Build(); app.UseDefaultFiles(); var contentTypeProvider = new FileExtensionContentTypeProvider(); contentTypeProvider.Mappings[".txt"] = "text/plain"; contentTypeProvider.Mappings[".jpg"] = "image/jpeg"; contentTypeProvider.Mappings[".jpeg"] = "image/jpeg"; contentTypeProvider.Mappings[".png"] = "image/png"; contentTypeProvider.Mappings[".html"] = "text/html"; contentTypeProvider.Mappings[".js"] = "application/javascript"; contentTypeProvider.Mappings[".css"] = "text/css"; contentTypeProvider.Mappings[".mp4"] = "video/mp4"; contentTypeProvider.Mappings[".mp3"] = "audio/mpeg"; contentTypeProvider.Mappings[".json"] = "application/json"; contentTypeProvider.Mappings[".pdf"] = "application/pdf"; string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package"); if (!Directory.Exists(packagePath)) { Directory.CreateDirectory(packagePath); } app.UseStaticFiles(); // Configure the HTTP request pipeline. app.UseHttpsRedirection(); app.UseRouting(); app.UseCors("any"); app.UseAuthorization(); app.MapControllers(); app.MapFallbackToFile("/index.html"); app.MapHub("/signalr/exam").RequireCors("any"); var connectionManager = app.Services.GetRequiredService(); await connectionManager.InitializeAsync(); await app.RunAsync(); } } }