ASP.NET Core
ASP.NET Core的運(yùn)行機(jī)制
圖示說明
1、Web server: ASP.NET CORE 提供兩種服務(wù)器可用:kestrel and HTTP.sys
- kestrel 是一個(gè)跨平臺(tái)的Web服務(wù)器
- HTTP.sys 只能用在Windows中
2、Internet : 廣域網(wǎng)中,需要windows驗(yàn)證的時(shí)候,可以選擇HTTP.sys
3、IIS、Apache、Nginx:反向代理服務(wù)器
ASP .NET Core 的啟動(dòng)
啟動(dòng)流程圖如下
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.UseStartup<Startup>();
});
}
- Main:程序的起點(diǎn),.Net Core 應(yīng)用程序本質(zhì)上是控制臺(tái)應(yīng)用程序
- CreateDefaultBuilder: 創(chuàng)建并配置WebHostBuilder, 首先調(diào)用Create-DefaultBuilder, 進(jìn)行一系列配置。
-
UseStartup:指定StartUp為啟動(dòng)配置文件。在StartUp中做兩個(gè)重要的工作
- ConfigureServices方法是注冊(cè)服務(wù)
- Configure方法是配置管道,用來具體指定如何處理每個(gè)http請(qǐng)求的, 例如我們可以讓這個(gè)程序知道我使用mvc來處理http請(qǐng)求, 那就調(diào)用app.UseMvc()這個(gè)方法就行.
- BuildWebHost:生成WebHostBuilder并進(jìn)行了一系列配置之后, 通過CreateHostBuilder(args)對(duì)象來Build出一個(gè)IHostBuilder。
- Run:調(diào)用IWebHost的Run方法使之開始運(yùn)行。
反向編譯進(jìn)入CreateDefaulBuilder方法中可以看到相重點(diǎn)關(guān)鍵字
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
HostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
hostBuilder.ConfigureHostConfiguration((Action<IConfigurationBuilder>)(config =>
{
config.AddEnvironmentVariables("DOTNET_");
if (args == null)
return;
config.AddCommandLine(args);
}));
hostBuilder.ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)((hostingContext, config) =>
{
IHostEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
bool reloadOnChange = hostingContext.Configuration.GetValue<bool>("hostBuilder:reloadConfigOnChange", true);
config.AddJsonFile("appsettings.json", true, reloadOnChange).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", true, reloadOnChange);
if (hostingEnvironment.IsDevelopment() && !string.IsNullOrEmpty(hostingEnvironment.ApplicationName))
{
Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
if (assembly != (Assembly)null)
UserSecretsConfigurationExtensions.AddUserSecrets(config, assembly, true);
}
config.AddEnvironmentVariables();
if (args == null)
return;
config.AddCommandLine(args);
})).ConfigureLogging((Action<HostBuilderContext, ILoggingBuilder>)((hostingContext, logging) =>
{
bool flag = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
if (flag)
logging.AddFilter<EventLogLoggerProvider>((Func<LogLevel, bool>)(level => level >= LogLevel.Warning));
logging.AddConfiguration((IConfiguration)hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
if (flag)
logging.AddEventLog();
logging.Configure((Action<LoggerFactoryOptions>)(options => options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId | ActivityTrackingOptions.TraceId | ActivityTrackingOptions.ParentId));
})).UseDefaultServiceProvider((Action<HostBuilderContext, ServiceProviderOptions>)((context, options) =>
{
bool flag = context.HostingEnvironment.IsDevelopment();
options.ValidateScopes = flag;
options.ValidateOnBuild = flag;
}));
return (IHostBuilder)hostBuilder;
}
UseKestrel 指定服務(wù)器使用 Kestrel,若使用HttpSys,需使用UseHttpSys。
UseContentRoot 指定根目錄
ConfigureAppConfiguration 讀取配置文件
ConfigureLogging 配置日志處理程序
UseIISIntegration 將應(yīng)用程序配置為在 IIS 中運(yùn)行。如果應(yīng)用程序沒有使用 IIS 作為反向代理,那么 UseIISIntegration 不會(huì)有任何效果。因此,即使應(yīng)用程序在非 IIS 方案中運(yùn)行,也可以安全調(diào)用這種方法。
UseDefaultServiceProvider 設(shè)置默認(rèn)的依賴注入容器。
ASP .NET Core 管道中間件
請(qǐng)求管道 處理http requests并返回responses的代碼組成了request pipeline(請(qǐng)求管道).
中間件: 我們可以使用一些程序來配置請(qǐng)求管道(request pipeline)以便處理requests和responses. 比如處理驗(yàn)證(authentication)的程序, MVC本身就是個(gè)中間件(middleware).
當(dāng)接收到一個(gè)請(qǐng)求時(shí),請(qǐng)求會(huì)交給中間件構(gòu)成的中間件管道進(jìn)行處理,管道就是多個(gè)中間件構(gòu)成,請(qǐng)求從一個(gè)中間件的一端進(jìn)入,從中間件的另一端出來,每個(gè)中間件都可以對(duì)HttpContext請(qǐng)求開始和結(jié)束進(jìn)行處理.
博主GitHub地址
關(guān)注公眾號(hào)不迷路
[圖片上傳失敗...(image-cd17f7-1608183170669)]