Program.cs 5.4 KB

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