ASP.NET 啟動和運行機制

ASP.NET Core

ASP.NET Core的運行機制

Alt

圖示說明

1、Web server: ASP.NET CORE 提供兩種服務(wù)器可用:kestrel and HTTP.sys

  • kestrel 是一個跨平臺的Web服務(wù)器
  • HTTP.sys 只能用在Windows中

2、Internet : 廣域網(wǎng)中,需要windows驗證的時候,可以選擇HTTP.sys

3、IIS、Apache、Nginx:反向代理服務(wù)器

ASP .NET Core 的啟動

啟動流程圖如下

Alt
    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>();
                });
    }
  1. Main:程序的起點,.Net Core 應(yīng)用程序本質(zhì)上是控制臺應(yīng)用程序
  2. CreateDefaultBuilder: 創(chuàng)建并配置WebHostBuilder, 首先調(diào)用Create-DefaultBuilder, 進行一系列配置。
  3. UseStartup:指定StartUp為啟動配置文件。在StartUp中做兩個重要的工作
    • ConfigureServices方法是注冊服務(wù)
    • Configure方法是配置管道,用來具體指定如何處理每個http請求的, 例如我們可以讓這個程序知道我使用mvc來處理http請求, 那就調(diào)用app.UseMvc()這個方法就行.
  4. BuildWebHost:生成WebHostBuilder并進行了一系列配置之后, 通過CreateHostBuilder(args)對象來Build出一個IHostBuilder。
  5. Run:調(diào)用IWebHost的Run方法使之開始運行。

反向編譯進入CreateDefaulBuilder方法中可以看到相重點關(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īng)用程序沒有使用 IIS 作為反向代理,那么 UseIISIntegration 不會有任何效果。因此,即使應(yīng)用程序在非 IIS 方案中運行,也可以安全調(diào)用這種方法。
UseDefaultServiceProvider 設(shè)置默認的依賴注入容器。

ASP .NET Core 管道中間件

請求管道 處理http requests并返回responses的代碼組成了request pipeline(請求管道).
中間件: 我們可以使用一些程序來配置請求管道(request pipeline)以便處理requests和responses. 比如處理驗證(authentication)的程序, MVC本身就是個中間件(middleware).

當接收到一個請求時,請求會交給中間件構(gòu)成的中間件管道進行處理,管道就是多個中間件構(gòu)成,請求從一個中間件的一端進入,從中間件的另一端出來,每個中間件都可以對HttpContext請求開始和結(jié)束進行處理.

中間件

博主GitHub地址

https://github.com/yuyue5945

關(guān)注公眾號不迷路

[圖片上傳失敗...(image-cd17f7-1608183170669)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容