做里番网站犯法吗,中建八局第一建设有限公司资质,青岛建设集团 招聘信息网站,陕西精诚展览装饰有限公司通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目#xff0c;重点关注Host.CreateDefaultBuilder(args)中的执行过程#xff0c;主要包括主机配置、应用程序配置、日志配置和依赖注入配置这4个部分。由于水平和篇幅有限#xff0c;先整体理解、建立框架#xf… 通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目重点关注Host.CreateDefaultBuilder(args)中的执行过程主要包括主机配置、应用程序配置、日志配置和依赖注入配置这4个部分。由于水平和篇幅有限先整体理解、建立框架后面再逐步细化对每个配置部分再详细拆解。一.创建默认主机Host.CreateDefaultBuilder1.创建主机构建器CreateHostBuilder(args)基于ASP.NET Core 5.0构建的Web API项目的Program.cs文件大家应该都很熟悉public class Program
{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder {webBuilder.UseStartupStartup();});
}2.创建默认构建器Host.CreateDefaultBuilder(args)本文重点讲解下Host.CreateDefaultBuilder(args)的执行过程Microsoft.Extensions.Hosting.Host是一个静态类包含2个方法public static IHostBuilder CreateDefaultBuilder() CreateDefaultBuilder(args: null);
public static IHostBuilder CreateDefaultBuilder(string[] args);上面的方法最终调用的还是下面的方法下面的方法主要包括几个部分主机配置ConfigureHostConfiguration应用程序配置ConfigureAppConfiguration日志配置ConfigureLogging依赖注入配置UseDefaultServiceProvider。二.主机配置ConfigureHostConfiguration主机配置ConfigureHostConfiguration相关源码如下builder.UseContentRoot(Directory.GetCurrentDirectory());
builder.ConfigureHostConfiguration(config
{config.AddEnvironmentVariables(prefix: DOTNET_);if (args ! null){config.AddCommandLine(args);}
});1.内存配置源Directory.GetCurrentDirectory()当前目录指的就是D:\SoftwareProject\C#Program\WebApplication3\WebApplication3。2.环境变量配置源config.AddEnvironmentVariables(prefix: DOTNET_)添加了前缀为DOTNET_的环境变量。3.命令行配置源最开始认为参数args为null经过调试发现args的值string[0]并且args ! null所以会有命令行配置源CommandLineConfigurationSource。三.应用程序配置ConfigureAppConfiguration应用程序配置ConfigureAppConfiguration相关源码如下builder.ConfigureAppConfiguration((hostingContext, config)
{IHostEnvironment env hostingContext.HostingEnvironment;bool reloadOnChange hostingContext.Configuration.GetValue(hostBuilder:reloadConfigOnChange, defaultValue: true);config.AddJsonFile(appsettings.json, optional: true, reloadOnChange: reloadOnChange).AddJsonFile($appsettings.{env.EnvironmentName}.json, optional: true, reloadOnChange: reloadOnChange);if (env.IsDevelopment() !string.IsNullOrEmpty(env.ApplicationName)){var appAssembly Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly ! null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();if (args ! null){config.AddCommandLine(args);}
})1.程序运行的主机环境hostingContext.HostingEnvironment表示运行程序的主机环境比如开发环境或者生产环境。IHostEnvironment接口的数据结构为public interface IHostEnvironment
{// Developmentstring EnvironmentName { get; set; }// WebApplication3string ApplicationName { get; set; }// D:\SoftwareProject\C#Program\WebApplication3\WebApplication3string ContentRootPath { get; set; }// PhysicalFileProviderIFileProvider ContentRootFileProvider { get; set; }
}2.加载json配置文件接下来就是通过AddJsonFile()来添加配置文件了如下所示(1)Path(string)json文件的相对路径位置。(2)Optional(bool)指定文件是否是必须的如果为false那么如果找不到文件就会抛出文件找不到异常。(3)ReloadOnchange(bool)如果为true那么当改变配置文件应用程序也会随之更改而无需重启。在该项目中总共有2个配置文件分别是appsettings.json和appsettings.Development.json。3.添加用户秘钥配置源config.AddUserSecrets(appAssembly, optional: true)主要是在开发的过程中用来保护配置文件中的敏感数据的比如密码等。因为平时在开发中很少使用所以在此不做深入讨论如果感兴趣可参考[3]。四.日志配置ConfigureLogging日志配置ConfigureLogging相关源码如下.ConfigureLogging((hostingContext, logging)
{bool isWindows RuntimeInformation.IsOSPlatform(OSPlatform.Windows);if (isWindows){// Default the EventLogLoggerProvider to warning or abovelogging.AddFilterEventLogLoggerProvider(level level LogLevel.Warning);}logging.AddConfiguration(hostingContext.Configuration.GetSection(Logging));logging.AddConsole();logging.AddDebug();logging.AddEventSourceLogger();if (isWindows){// Add the EventLogLoggerProvider on windows machineslogging.AddEventLog();}logging.Configure(options {options.ActivityTrackingOptions ActivityTrackingOptions.SpanId| ActivityTrackingOptions.TraceId| ActivityTrackingOptions.ParentId;});
})1.Windows日志级别从上述代码中可以看到是LogLevel.Warning及以上。2.日志的配置ILoggerProvider不同的实现方式有ConsoleLoggerProviderDebugLoggerProviderEventSourceLoggerProviderEventLogLoggerProviderTraceSourceLoggerProvider自定义。下面是日志配置涉及的相关代码logging.AddConsole(); //将日志输出到控制台
logging.AddDebug(); //将日志输出到调试窗口
logging.AddEventSourceLogger();
logging.AddEventLog();说明这一部分详细的日志分析可以参考[6]。3.ActivityTrackingOptionspublic enum ActivityTrackingOptions
{None 0, //No traces will be included in the logSpanId 1, //The record will contain the Span identifierTraceId 2, //The record will contain the tracking identifierParentId 4, //The record will contain the parent identifierTraceState 8, //The record will contain the tracking statusTraceFlags 16, //The log will contain trace flags
}在最新的.NET 7 Preview6中又增加了Tags(32)和Baggage(64)。五.依赖注入配置UseDefaultServiceProvider依赖注入配置UseDefaultServiceProvider相关源码如下.UseDefaultServiceProvider((context, options)
{bool isDevelopment context.HostingEnvironment.IsDevelopment();options.ValidateScopes isDevelopment;options.ValidateOnBuild isDevelopment;
});UseDefaultServiceProvider主要是设置默认的依赖注入容器。参考文献[1].NET Source Browserhttps://source.dot.net/[2]Safe storage of app secrets in development in ASP.NET Corehttps://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?viewaspnetcore-6.0tabswindows[3]认识ASP.NET Core/Host及其配置解析https://zhuanlan.zhihu.com/p/343312339[4]源码解析.Net中Host主机的构建过程https://www.cnblogs.com/snailZz/p/15240616.html[5].NET Core通用Host源码分析https://www.cnblogs.com/yingbiaowang/p/15048495.html[6]基于.NetCore3.1系列--日志记录之日志配置揭秘https://www.cnblogs.com/i3yuan/p/13411793.html[7]基于.NetCore3.1系列--日志记录之日志核心要素揭秘https://www.cnblogs.com/i3yuan/p/13442509.html[8].NET5中Host.CreateDefaultBuilder(args)详解https://blog.csdn.net/qbc12345678/article/details/122983855[9]ASP.NET启动和运行机制https://www.jianshu.com/p/59cfaba4e2cb[10]ASP.Net Core解读通用主机和托管服务https://www.cnblogs.com/qtiger/p/12976207.html