ASP.NET 啟動和執行機制
ASP.NET Core
ASP.NET Core的執行機制
圖示說明
1、Web server: ASP.NET CORE 提供兩種伺服器可用:kestrel and HTTP.sys
- kestrel 是一個跨平臺的Web伺服器
- HTTP.sys 只能用在Windows中
2、Internet : 廣域網中,需要windows驗證的時候,可以選擇HTTP.sys
3、IIS、Apache、Nginx:反向代理伺服器
ASP .NET Core 的啟動
啟動流程圖如下
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:程式的起點,.Net Core 應用程式本質上是控制檯應用程式
- CreateDefaultBuilder: 建立並配置WebHostBuilder, 首先呼叫CreateDefaultBuilder, 進行一系列配置。
- UseStartup:指定StartUp為啟動配置檔案。在StartUp中做兩個重要的工作
- ConfigureServices方法是註冊服務
- Configure方法是配置管道,用來具體指定如何處理每個http請求的, 例如我們可以讓這個程式知道我使用mvc來處理http請求, 那就呼叫app.UseMvc()這個方法就行.
- BuildWebHost:生成WebHostBuilder並進行了一系列配置之後, 通過CreateHostBuilder(args)物件來Build出一個IHostBuilder。
- Run:呼叫IWebHost的Run方法使之開始執行。
反向編譯進入CreateDefaulBuilder方法中可以看到相重點關鍵字
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 指定伺服器使用 Kestrel,若使用HttpSys,需使用UseHttpSys。
UseContentRoot 指定根目錄
ConfigureAppConfiguration 讀取配置檔案
ConfigureLogging 配置日誌處理程式
UseIISIntegration 將應用程式配置為在 IIS 中執行。如果應用程式沒有使用 IIS 作為反向代理,那麼 UseIISIntegration 不會有任何效果。因此,即使應用程式在非 IIS 方案中執行,也可以安全呼叫這種方法。
UseDefaultServiceProvider 設定預設的依賴注入容器。
ASP .NET Core 管道中介軟體
請求管道 處理http requests並返回responses的程式碼組成了request pipeline(請求管道).
中介軟體: 我們可以使用一些程式來配置請求管道(request pipeline)以便處理requests和responses. 比如處理驗證(authentication)的程式, MVC本身就是個中介軟體(middleware).
當接收到一個請求時,請求會交給中介軟體構成的中介軟體管道進行處理,管道就是多箇中間件構成,請求從一箇中間件的一端進入,從中介軟體的另一端出來,每個中介軟體都可以對HttpContext請求開始和結束進行處理.