using System; using System.IO; using System.Reflection; using System.Xml; using Autofac.Extensions.DependencyInjection; using Blog.Core.Model.Models; using log4net; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Blog.Core { public class Program { private static readonly ILog log = LogManager.GetLogger(typeof(Program)); public static void Main(string[] args) { XmlDocument log4netConfig = new XmlDocument(); log4netConfig.Load(File.OpenRead("Log4net.config")); var repo = log4net.LogManager.CreateRepository( Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy)); log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]); // 生成承载 web 应用程序的 Microsoft.AspNetCore.Hosting.IWebHost。Build是WebHostBuilder最终的目的,将返回一个构造的WebHost,最终生成宿主。 var host = CreateHostBuilder(args).Build(); // 创建可用于解析作用域服务的新 Microsoft.Extensions.DependencyInjection.IServiceScope。 using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; var loggerFactory = services.GetRequiredService(); try { // 从 system.IServicec提供程序获取 T 类型的服务。 // 数据库连接字符串是在 Model 层的 Seed 文件夹下的 MyContext.cs 中 var configuration = services.GetRequiredService(); if (configuration.GetSection("AppSettings")["SeedDBEnabled"].ObjToBool() || configuration.GetSection("AppSettings")["SeedDBDataEnabled"].ObjToBool()) { var myContext = services.GetRequiredService(); var Env = services.GetRequiredService(); DBSeed.SeedAsync(myContext, Env.WebRootPath).Wait(); } } catch (Exception e) { log.Error($"Error occured seeding the Database.\n{e.Message}"); throw; } } // 运行 web 应用程序并阻止调用线程, 直到主机关闭。 // 创建完 WebHost 之后,便调用它的 Run 方法,而 Run 方法会去调用 WebHost 的 StartAsync 方法 // 将Initialize方法创建的Application管道传入以供处理消息 // 执行HostedServiceExecutor.StartAsync方法 // ※※※※ 有异常,查看 Log 文件夹下的异常日志 ※※※※ host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS .ConfigureWebHostDefaults(webBuilder => { webBuilder .ConfigureKestrel(serverOptions => { serverOptions.AllowSynchronousIO = true;//启用同步 IO }) .UseStartup() .UseUrls("http://localhost:8081") .ConfigureLogging((hostingContext, builder) => { builder.ClearProviders(); builder.SetMinimumLevel(LogLevel.Trace); builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); builder.AddConsole(); builder.AddDebug(); }); }); } }