using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.Server.Features; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Serilog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Loader; using System.Text.Encodings.Web; using System.Text.Unicode; using WinFormNet5; namespace TestServer { public class Startup { public IWebHostEnvironment Env { get; } public IConfiguration Configuration { get; } private readonly string _origins = "AllowAllHeaders"; private string _url; private Dictionary assemblyList = new Dictionary(); public Startup(IWebHostEnvironment env, IConfiguration configuration) { this.Env = env; this.Configuration = configuration; this.Init(); } private void Init() { var pluginsPath = Path.Combine(this.Env.WebRootPath, "plugin"); var pluginsPathCopy = Path.Combine(this.Env.WebRootPath, "plugin", "copy"); Directory.CreateDirectory(pluginsPath); Directory.CreateDirectory(pluginsPathCopy); var files = Directory.GetFiles(pluginsPath); foreach (var file in files) { var fileName = Path.GetFileName(file); var copyFile = Path.Combine(pluginsPathCopy, fileName); if (!File.Exists(copyFile) || file.Md5() != copyFile.Md5()) { File.Copy(file, copyFile, true); } } var assemblyFiles = Directory.GetFiles(pluginsPathCopy, "*.dll", SearchOption.AllDirectories); foreach (var file in assemblyFiles) { using var fs = new FileStream(file, FileMode.Open); var assembly = new AssemblyLoadContext(file, true).LoadFromStream(fs); this.assemblyList.Add(file,assembly); } } public void ConfigureServices(IServiceCollection services) { Log.Logger.Information("Startup>ConfigureServices"); services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.AddCors(options => options.AddPolicy(_origins, builder => { builder.SetIsOriginAllowed(o => true) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); })); services.AddSingleton(MyActionDescriptorChangeProvider.Instance); services.AddSingleton(MyActionDescriptorChangeProvider.Instance); services.AddHttpClient(); services.AddControllersWithViews() .AddNewtonsoftJson(o => { o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }) .ConfigureApplicationPartManager(ConfigureApplicationParts); foreach (var assembly in this.assemblyList) { try { assembly.Value.GetTypes() .Where(o => typeof(IStartup).IsAssignableFrom(o)) .ToList() .ForEach(o => (assembly.Value.CreateInstance(o.FullName) as IStartup).ConfigureServices(services)); } catch (Exception ex) { Log.Error(ex.ToString()); } } } public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime, ILogger logger) { logger.LogInformation("Startup->Configure"); app.UseSerilogRequestLogging(); lifetime.ApplicationStarted.Register(() => { this._url = app.ServerFeatures.Get().Addresses.FirstOrDefault(); logger.LogInformation($"ApplicationStarted {this._url}"); //Program.MainForm.BeginInvoke(new EventHandler(delegate { // Program.MainForm.SetUrl(this._url, Env.WebRootPath); //})); }); lifetime.ApplicationStopped.Register(() => { logger.LogInformation($"ApplicationStopped {this._url}"); }); app.UseDeveloperExceptionPage(); app.UseCors(_origins); foreach (var assembly in this.assemblyList) { try { assembly.Value.GetTypes() .Where(o => typeof(IStartup).IsAssignableFrom(o)) .ToList() .ForEach(o => (assembly.Value.CreateInstance(o.FullName) as IStartup).Configure(app)); assembly.Value.GetTypes() .Where(o => o.Name.EndsWith("Middleware")) .ToList() .ForEach(o => app.UseMiddleware(o)); } catch (Exception ex) { Log.Error(ex.ToString()); } } app.UseStaticFiles(new StaticFileOptions { ServeUnknownFileTypes = true, //ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary{ // { ".dat","video/webm"} //}) }); app.UseFileServer(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } private void ConfigureApplicationParts(ApplicationPartManager apm) { Log.Logger.Information("Startup>ConfigureApplicationParts"); foreach (var assembly in assemblyList) { try { if (assembly.Key.EndsWith(".Views.dll")) { apm.ApplicationParts.Add(new MyCompiledRazorAssemblyPart(assembly.Value)); } else { apm.ApplicationParts.Add(new MyAssemblyPart(assembly.Value)); } } catch (Exception ex) { Log.Error(ex.ToString()); } } } } }