Program.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using IES.ExamServer.DI;
  2. using IES.ExamServer.DI.SignalRHost;
  3. using IES.ExamServer.Filters;
  4. using Microsoft.AspNetCore.StaticFiles;
  5. using NLog.Extensions.Logging;
  6. using SkiaSharp;
  7. using System.Drawing;
  8. using System.Text;
  9. using System.Text.Encodings.Web;
  10. using System.Text.Unicode;
  11. using static System.Net.Mime.MediaTypeNames;
  12. using System.Diagnostics;
  13. using System.Security.Authentication;
  14. namespace IES.ExamServer.Server
  15. {
  16. public class Program
  17. {
  18. public async static Task Main(string[] args)
  19. {
  20. Console.OutputEncoding = Encoding.UTF8;
  21. var builder = WebApplication.CreateBuilder(args);
  22. // Add services to the container.
  23. builder.WebHost.ConfigureKestrel(serverOptions =>
  24. {
  25. // 配置支持的 SSL/TLS 协议版本
  26. serverOptions.ConfigureHttpsDefaults(httpsOptions =>
  27. {
  28. httpsOptions.SslProtocols = SslProtocols.Tls |
  29. SslProtocols.Tls11 |
  30. SslProtocols.Tls12 |
  31. SslProtocols.Tls13;
  32. });
  33. });
  34. string path = $"{builder.Environment.ContentRootPath}/Configs";
  35. // Add services to the container.
  36. builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  37. // Add services to the container.
  38. builder.Services.AddControllersWithViews().AddJsonOptions(options =>
  39. {
  40. // 设置 JSON 序列化选项
  41. options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 允许所有 Unicode 字符
  42. options.JsonSerializerOptions.WriteIndented = true; // 格式化输出(可选)
  43. });
  44. builder.Services.AddHttpClient();
  45. builder.Services.AddSignalR();
  46. builder.Services.AddHttpContextAccessor();
  47. //此处能在Linux及MacOS运行,
  48. //Windows的路径是LocalApplicationData Path: C:\Users\john\AppData\Local
  49. //Linux的路径是LocalApplicationData Path: /home/john/.local/share,
  50. //MacOS 的路径LocalApplicationData Path: /Users/john/Library/Application Support
  51. string localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
  52. //string dbpath = $"{localAppDataPath}\\ExamServer\\LiteDB";
  53. string dbpath = Path.Combine(localAppDataPath, "ExamServer", "LiteDB");
  54. if (!System.IO.Directory.Exists(dbpath))
  55. {
  56. System.IO.Directory.CreateDirectory(dbpath);
  57. }
  58. string liteDBPath = $"Filename={dbpath}/data.db;Connection=shared";
  59. var connections_LiteDB = new List<LiteDBFactoryOptions>
  60. {
  61. new LiteDBFactoryOptions { Name = "Master", Connectionstring = liteDBPath}
  62. };
  63. builder.Services.AddLiteDB(connections_LiteDB);
  64. builder.Services.AddMemoryCache();
  65. // 注册 ConnectionService 为单例
  66. builder.Services.AddSingleton<CenterServiceConnectionService>();
  67. builder.Services.AddSingleton<ServiceInitializer>();
  68. // 注册 DataQueue 服务
  69. builder.Services.AddSingleton<DataQueue>();
  70. // 注册后台服务
  71. builder.Services.AddHostedService<SubjectPushService>();
  72. builder.Services.AddCors(options =>
  73. {
  74. //options.AddDefaultPolicy(
  75. //builder =>
  76. //{
  77. // builder.AllowAnyOrigin()
  78. // .AllowAnyHeader()
  79. // .AllowAnyMethod();
  80. //});
  81. options.AddPolicy("any", builder =>
  82. {
  83. //builder.SetIsOriginAllowed(x => true)
  84. //.AllowAnyMethod()
  85. //.AllowAnyHeader()
  86. //.AllowCredentials();
  87. builder.AllowAnyOrigin()
  88. .AllowAnyHeader()
  89. .AllowAnyMethod();
  90. });
  91. });
  92. builder.Services.AddMvcFilter<AuthTokenActionFilter>();
  93. // 添加自定义日志提供程序
  94. //builder.Logging.ClearProviders();
  95. //bool enableConsoleOutput = true;
  96. //builder.Logging.AddProvider(new CustomFileLoggerProvider(Path.Combine(Directory.GetCurrentDirectory(), "Logs"), enableConsoleOutput));
  97. // 添加日志服务
  98. builder.Logging.ClearProviders();
  99. builder.Logging.AddNLog();
  100. builder.Services.AddHostedService<SignalRCloudClientHub>();
  101. var app = builder.Build();
  102. app.UseDefaultFiles();
  103. var contentTypeProvider = new FileExtensionContentTypeProvider();
  104. contentTypeProvider.Mappings[".txt"] = "text/plain";
  105. contentTypeProvider.Mappings[".jpg"] = "image/jpeg";
  106. contentTypeProvider.Mappings[".jpeg"] = "image/jpeg";
  107. contentTypeProvider.Mappings[".png"] = "image/png";
  108. contentTypeProvider.Mappings[".html"] = "text/html";
  109. contentTypeProvider.Mappings[".js"] = "application/javascript";
  110. contentTypeProvider.Mappings[".css"] = "text/css";
  111. contentTypeProvider.Mappings[".mp4"] = "video/mp4";
  112. contentTypeProvider.Mappings[".mp3"] = "audio/mpeg";
  113. contentTypeProvider.Mappings[".json"] = "application/json";
  114. contentTypeProvider.Mappings[".pdf"] = "application/pdf";
  115. string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package");
  116. if (!Directory.Exists(packagePath))
  117. {
  118. Directory.CreateDirectory(packagePath);
  119. }
  120. app.UseStaticFiles();
  121. // Configure the HTTP request pipeline.
  122. app.UseHttpsRedirection();
  123. app.UseRouting();
  124. app.UseCors("any");
  125. app.UseAuthorization();
  126. app.MapControllers();
  127. app.MapFallbackToFile("/index.html");
  128. app.MapHub<SignalRExamServerHub>("/signalr/exam").RequireCors("any");
  129. var connectionManager = app.Services.GetRequiredService<ServiceInitializer>();
  130. await connectionManager.InitializeAsync();
  131. await app.RunAsync();
  132. }
  133. }
  134. }