如何高效配置和管理ASP.NET Core的Web主机?

2026-03-30 10:411阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2507个文字,预计阅读时间需要11分钟。

如何高效配置和管理ASP.NET Core的Web主机?

目录

1.前言

2.设置主机

2.1 执行下列任务 2.2 修改和增强定义的配置

3.主机配置值

3.1 应用程序键(名称) 3.2 捕获启动错误 3.3 内容根 3.4 详细错误 3.5 环境 3.6 HTTPS端口 3.7 服务器(Kestrel)URL

目录
  • 1.前言
  • 2.设置主机
    • 2.1执行下列任务
    • 2.2重写和增强定义的配置
  • 3.主机配置值
    • 3.1应用程序键(名称)
    • 3.2捕获启动错误
    • 3.3内容根
    • 3.4详细错误
    • 3.5环境
    • 3.6HTTPS端口
    • 3.7服务器(Kestrel) URL
  • 4.重写配置
    • 5.管理主机
      • 6.IHostingEnvironment接口
        • 7.IApplicationLifetime接口
          • 8.作用域验证

            1.前言

            ASP.NET Core应用程序可以配置和启动主机(Host)。主机负责应用程序启动和生命周期管理,配置服务器和请求处理管道。主机还可以设置日志记录、依赖关系注入和配置。而Host主机又包括Web主机(IWebHostBuilder)和通用主机(IHostBuilder)。该章节主要介绍了用于托管Web应用的Web主机。对于其他类型的应用,请使用通用主机。

            2.设置主机

            创建使用IWebHostBuilder实例的主机。通常在应用程序的入口点来执行Main方法。在项目模板中,Main位于Program.cs。典型应用默认调用CreateDefaultBuilder来开始创建主机:

            public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }

            2.1执行下列任务

            调用CreateDefaultBuilder的代码位于名为CreateWebHostBuilder的方法中,这让它区分于 Main中对生成器对象调用Run的代码。CreateDefaultBuilder执行下列任务:
            ●使用应用程序的托管配置提供应用程序将Kestrel服务器配置为Web服务器。
            ●将内容根设置为由 Directory.GetCurrentDirectory返回的路径。
            ●通过以下对象加载主机配置:
            ○前缀为ASPNETCORE_的环境变量(例如,ASPNETCORE_ENVIRONMENT)。
            ○命令行参数。
            ●按以下顺序加载应用程序配置:
            ○appsettings.json。
            ○appsettings.{Environment}.json。
            ○应用在使用入口程序集的Development环境中运行时的机密管理器。
            ○环境变量。
            ○命令行参数。
            ●配置控制台和调试输出的日志记录。日志记录包含appsettings.json或appsettings.{Environment}.json文件的日志记录配置部分中指定的日志筛选规则。
            ●使用ASP.NET Core模块在IIS后面运行时,CreateDefaultBuilder会启用IIS集成,这会配置应用程序的基址和端口。IIS集成还配置应用程序以捕获启动错误。
            ●如果应用环境为“开发(Development)”,请将ServiceProviderOptions.ValidateScopes设为true。

            2.2重写和增强定义的配置

            ConfigureAppConfiguration、ConfigureLogging以及IWebHostBuilder的其他方法和扩展方法可重写和增强CreateDefaultBuilder定义的配置。下面是一些示例:
            ConfigureAppConfiguration:用于指定应用程序的其他IConfiguration。下面的ConfigureAppConfiguration调用添加委托,以在appsettings.xml文件中添加应用程序配置,该示例在Core系列第11章节有演示。可多次调用ConfigureAppConfiguration。请注意,此配置不适用于主机(例如,服务器URL或环境)。

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true); });

            ConfigureLogging:ConfigureLogging调用添加委托,将最小日志记录级别 (SetMinimumLevel)配置为LogLevel.Warning。此设置重写CreateDefaultBuilder在appsettings.Development.json和appsettings.Production.json中配置,分别为LogLevel.Debug和LogLevel.Error。可多次调用 ConfigureLogging。

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.SetMinimumLevel(LogLevel.Warning); });

            ConfigureKestrel:调用ConfigureKestrel来重写CreateDefaultBuilder在配置Kestrel时建立的30,000,000字节默认Limits.MaxRequestBodySize:

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureKestrel((context, options) => { options.Limits.MaxRequestBodySize = 20000000; });

            设置主机时,可以提供配置和ConfigureServices方法。如果指定Startup类,必须定义Configure方法。

            3.主机配置值

            WebHostBuilder依赖于以下的方法设置主机配置值:
            ●主机生成器配置,其中包括格式ASPNETCORE_{configurationKey}的环境变量。例如 ASPNETCORE_ENVIRONMENT。
            ●UseContentRoot和UseConfiguration等扩展。
            ●UseSetting和关联键。使用UseSetting设置值时,该值设置为无论何种类型的字符串。

            3.1应用程序键(名称)

            在主机构造期间调用UseStartup或Configure时,会自动设置 IHostingEnvironment.ApplicationName属性。该值设置为包含应用入口点的程序集的名称。要显式设置值,请使用WebHostDefaults.ApplicationKey(环境变量:ASPNETCORE_APPLICATIONNAME):

            public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //应用程序默认名称为:CoreWeb (也就是项目名称)   string an = env.ApplicationName;   ... } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseSetting(WebHostDefaults.ApplicationKey, "CoreWeb");

            3.2捕获启动错误

            此设置控制启动错误的捕获。当false时,启动期间出错导致主机退出。当true时,主机在启动期间捕获异常并尝试启动服务器(环境变量:ASPNETCORE_CAPTURESTARTUPERRORS)。

            WebHost.CreateDefaultBuilder(args) .CaptureStartupErrors(true)

            3.3内容根

            此设置确定ASP.NET Core开始搜索内容文件,如MVC视图等。内容根也用作Web根设置的基路径。如果路径不存在,主机将无法启动(环境变量:ASPNETCORE_CONTENTROOT)。

            WebHost.CreateDefaultBuilder(args) .UseContentRoot("c:\\<content-root>")

            3.4详细错误

            确定是否应捕获详细错误。启用(或当环境设置为Development)时,应用捕获详细的异常(环境变量:ASPNETCORE_DETAILEDERRORS)。

            WebHost.CreateDefaultBuilder(args) .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

            3.5环境

            设置应用程序的环境。环境可以设置为任何值。框架定义的值包括Development、Staging和Production。值不区分大小写。默认情况下,从ASPNETCORE_ENVIRONMENT环境变量读取环境。使用Visual Studio时,可能会在launchSettings.json文件中设置环境变量。有关于环境详情信息,可以移步到Core系列第10章节有参阅(环境变量:ASPNETCORE_ENVIRONMENT)。

            WebHost.CreateDefaultBuilder(args) .UseEnvironment(EnvironmentName.Development)

            3.6HTTPS端口

            设置HTTPS重定向端口。用于强制实施HTTPS(环境变量:ASPNETCORE_HTTPS_PORT)。

            WebHost.CreateDefaultBuilder(args) .UseSetting("localhost:123。使用“*”指示服务器应针对请求侦听的使用特定端口和协议(例如 *:5000)的IP地址或主机名。协议(或)必须包含每个URL。不同的服务器支持的格式有所不同(环境变量:ASPNETCORE_URLS)。

            WebHost.CreateDefaultBuilder(args) .UseUrls("*:5000;localhost:5001;hostname:5002")

            4.重写配置

            使用配置可以配置Web主机。在下面的示例中,主机配置是根据需要在hostsettings.json文件中指定。命令行参数可能会重写从hostsettings.json文件加载的任何配置。生成的配置(在config中)用于通过UseConfiguration配置主机。
            新建一个hostsettings.json文件,内容如下:

            { "urls": "*:5005" }

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) { //IConfigurationBuilder的配置主机 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) //主机配置在hostsettings.json文件中指定 .AddJsonFile("hostsettings.json", optional: true) //输入的命令行参数可能会重写从hostsettings.json文件加载的任何配置 .AddCommandLine(args) .Build(); return WebHost.CreateDefaultBuilder(args) .UseUrls("*:5001") .UseConfiguration(config) .Configure(app => { //生成的配置委托函数 app.Run(context => context.Response.WriteAsync("Hello, World!")); }); }

            上述代码描述意思是若要指定在特定的URL上运行的主机,所需的值可以在执行dotnet运行时从命令提示符传入。命令行参数重写hostsettings.json文件中的urls值,且服务器侦听端口8080:

            dotnet run --urls "*:8080"

            主机启动时,先用hostsettings.json config重写UseUrls提供的urls参数配置,然后再用命令行参数config重写hostsettings.json config的urls参数配置。

            5.管理主机

            管理主机启动方式有Run和Start两种。Run方法启动Web应用程序并阻止调用线程,直到关闭主机。Start方法通过调用自身以非阻止方式运行主机。

            //Run CreateWebHostBuilder(args).Build().Run();

            //Start:非阻止方式,所有必须加上ReadLine CreateWebHostBuilder(args).Build().Start(); Console.ReadLine();

            6.IHostingEnvironment接口

            IHostingEnvironment接口提供有关应用的Web承载环境的信息。使用构造函数注入获取 IHostingEnvironment以使用其属性和扩展方法:

            //示例1: public class CustomFileReader { private readonly IHostingEnvironment _env; public CustomFileReader(IHostingEnvironment env) { _env = env; } public string ReadFile(string filePath) { var fileProvider = _env.WebRootFileProvider; // Process the file here } }

            可以用于在启动时基于环境配置应用程序或者将IHostingEnvironment注入到Startup构造函数,用于ConfigureServices:

            //示例2: public class Startup { public Startup(IHostingEnvironment env) { HostingEnvironment = env; } public IHostingEnvironment HostingEnvironment { get; } public void ConfigureServices(IServiceCollection services) { if (HostingEnvironment.IsDevelopment()) { // Development configuration } else { // Staging/Production configuration } var contentRootPath = HostingEnvironment.ContentRootPath; } }

            IHostingEnvironment服务还可以直接注入到Configure方法以设置处理管道:

            //示例3: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { // In Development, use the Developer Exception Page app.UseDeveloperExceptionPage(); } else { // In Staging/Production, route exceptions to /error app.UseExceptionHandler("/error"); } var contentRootPath = env.ContentRootPath; }

            创建自定义中间件(要了解中间件的同学们,可以移步到第四章节学习)时可以将IHostingEnvironment 注入Invoke方法:

            public async Task Invoke(HttpContext context, IHostingEnvironment env) { if (env.IsDevelopment()) { // Configure middleware for Development } else { // Configure middleware for Staging/Production } var contentRootPath = env.ContentRootPath; }

            7.IApplicationLifetime接口

            IApplicationLifetime允许后启动和关闭活动。接口上的三个属性是用于注册Action方法(用于定义启动和关闭事件)的取消标记。

            取消标记

            如何高效配置和管理ASP.NET Core的Web主机?

            触发条件

            ApplicationStarted

            主机已完全启动。

            ApplicationStopped

            主机正在完成正常关闭。应处理所有请求。 关闭受到阻止,直到完成此事件。

            ApplicationStopping

            主机正在执行正常关闭。仍在处理请求。关闭受到阻止,直到完成此事件。

            public class Startup { public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime) { appLifetime.ApplicationStarted.Register(OnStarted); appLifetime.ApplicationStopping.Register(OnStopping); appLifetime.ApplicationStopped.Register(OnStopped); Console.CancelKeyPress += (sender, eventArgs) => { appLifetime.StopApplication(); // Don't terminate the process immediately, wait for the Main thread to exit gracefully. eventArgs.Cancel = true; }; } private void OnStarted() { // Perform post-startup activities here } private void OnStopping() { // Perform on-stopping activities here } private void OnStopped() { // Perform post-stopped activities here } }

            StopApplication是请求应用终止的意思。以下类在调用类的Shutdown方法时使用StopApplication正常关闭应用:

            public class MyClass { private readonly IApplicationLifetime _appLifetime; public MyClass(IApplicationLifetime appLifetime) { _appLifetime = appLifetime; } public void Shutdown() { _appLifetime.StopApplication(); } }

            8.作用域验证

            如果应用环境为“开发(Development)”,则CreateDefaultBuilder将ServiceProviderOptions.ValidateScopes设为true。若将ValidateScopes设为true,默认服务提供应用程序会执行检查来验证以下内容:
            ●作用域服务不能直接或间接地从根服务提供者解析。
            ●作用域服务不会直接或间接地注入到单例中(服务的生命周期)。
            若要始终验证作用域(包括在生命周期环境中验证),请使用主机生成器上的 UseDefaultServiceProvider配置ServiceProviderOptions:

            WebHost.CreateDefaultBuilder(args) .UseDefaultServiceProvider((context, options) => { options.ValidateScopes = true; })

            到此这篇关于ASP.NET Core配置和管理Web主机的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

            本文共计2507个文字,预计阅读时间需要11分钟。

            如何高效配置和管理ASP.NET Core的Web主机?

            目录

            1.前言

            2.设置主机

            2.1 执行下列任务 2.2 修改和增强定义的配置

            3.主机配置值

            3.1 应用程序键(名称) 3.2 捕获启动错误 3.3 内容根 3.4 详细错误 3.5 环境 3.6 HTTPS端口 3.7 服务器(Kestrel)URL

            目录
            • 1.前言
            • 2.设置主机
              • 2.1执行下列任务
              • 2.2重写和增强定义的配置
            • 3.主机配置值
              • 3.1应用程序键(名称)
              • 3.2捕获启动错误
              • 3.3内容根
              • 3.4详细错误
              • 3.5环境
              • 3.6HTTPS端口
              • 3.7服务器(Kestrel) URL
            • 4.重写配置
              • 5.管理主机
                • 6.IHostingEnvironment接口
                  • 7.IApplicationLifetime接口
                    • 8.作用域验证

                      1.前言

                      ASP.NET Core应用程序可以配置和启动主机(Host)。主机负责应用程序启动和生命周期管理,配置服务器和请求处理管道。主机还可以设置日志记录、依赖关系注入和配置。而Host主机又包括Web主机(IWebHostBuilder)和通用主机(IHostBuilder)。该章节主要介绍了用于托管Web应用的Web主机。对于其他类型的应用,请使用通用主机。

                      2.设置主机

                      创建使用IWebHostBuilder实例的主机。通常在应用程序的入口点来执行Main方法。在项目模板中,Main位于Program.cs。典型应用默认调用CreateDefaultBuilder来开始创建主机:

                      public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }

                      2.1执行下列任务

                      调用CreateDefaultBuilder的代码位于名为CreateWebHostBuilder的方法中,这让它区分于 Main中对生成器对象调用Run的代码。CreateDefaultBuilder执行下列任务:
                      ●使用应用程序的托管配置提供应用程序将Kestrel服务器配置为Web服务器。
                      ●将内容根设置为由 Directory.GetCurrentDirectory返回的路径。
                      ●通过以下对象加载主机配置:
                      ○前缀为ASPNETCORE_的环境变量(例如,ASPNETCORE_ENVIRONMENT)。
                      ○命令行参数。
                      ●按以下顺序加载应用程序配置:
                      ○appsettings.json。
                      ○appsettings.{Environment}.json。
                      ○应用在使用入口程序集的Development环境中运行时的机密管理器。
                      ○环境变量。
                      ○命令行参数。
                      ●配置控制台和调试输出的日志记录。日志记录包含appsettings.json或appsettings.{Environment}.json文件的日志记录配置部分中指定的日志筛选规则。
                      ●使用ASP.NET Core模块在IIS后面运行时,CreateDefaultBuilder会启用IIS集成,这会配置应用程序的基址和端口。IIS集成还配置应用程序以捕获启动错误。
                      ●如果应用环境为“开发(Development)”,请将ServiceProviderOptions.ValidateScopes设为true。

                      2.2重写和增强定义的配置

                      ConfigureAppConfiguration、ConfigureLogging以及IWebHostBuilder的其他方法和扩展方法可重写和增强CreateDefaultBuilder定义的配置。下面是一些示例:
                      ConfigureAppConfiguration:用于指定应用程序的其他IConfiguration。下面的ConfigureAppConfiguration调用添加委托,以在appsettings.xml文件中添加应用程序配置,该示例在Core系列第11章节有演示。可多次调用ConfigureAppConfiguration。请注意,此配置不适用于主机(例如,服务器URL或环境)。

                      public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true); });

                      ConfigureLogging:ConfigureLogging调用添加委托,将最小日志记录级别 (SetMinimumLevel)配置为LogLevel.Warning。此设置重写CreateDefaultBuilder在appsettings.Development.json和appsettings.Production.json中配置,分别为LogLevel.Debug和LogLevel.Error。可多次调用 ConfigureLogging。

                      public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.SetMinimumLevel(LogLevel.Warning); });

                      ConfigureKestrel:调用ConfigureKestrel来重写CreateDefaultBuilder在配置Kestrel时建立的30,000,000字节默认Limits.MaxRequestBodySize:

                      public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureKestrel((context, options) => { options.Limits.MaxRequestBodySize = 20000000; });

                      设置主机时,可以提供配置和ConfigureServices方法。如果指定Startup类,必须定义Configure方法。

                      3.主机配置值

                      WebHostBuilder依赖于以下的方法设置主机配置值:
                      ●主机生成器配置,其中包括格式ASPNETCORE_{configurationKey}的环境变量。例如 ASPNETCORE_ENVIRONMENT。
                      ●UseContentRoot和UseConfiguration等扩展。
                      ●UseSetting和关联键。使用UseSetting设置值时,该值设置为无论何种类型的字符串。

                      3.1应用程序键(名称)

                      在主机构造期间调用UseStartup或Configure时,会自动设置 IHostingEnvironment.ApplicationName属性。该值设置为包含应用入口点的程序集的名称。要显式设置值,请使用WebHostDefaults.ApplicationKey(环境变量:ASPNETCORE_APPLICATIONNAME):

                      public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //应用程序默认名称为:CoreWeb (也就是项目名称)   string an = env.ApplicationName;   ... } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseSetting(WebHostDefaults.ApplicationKey, "CoreWeb");

                      3.2捕获启动错误

                      此设置控制启动错误的捕获。当false时,启动期间出错导致主机退出。当true时,主机在启动期间捕获异常并尝试启动服务器(环境变量:ASPNETCORE_CAPTURESTARTUPERRORS)。

                      WebHost.CreateDefaultBuilder(args) .CaptureStartupErrors(true)

                      3.3内容根

                      此设置确定ASP.NET Core开始搜索内容文件,如MVC视图等。内容根也用作Web根设置的基路径。如果路径不存在,主机将无法启动(环境变量:ASPNETCORE_CONTENTROOT)。

                      WebHost.CreateDefaultBuilder(args) .UseContentRoot("c:\\<content-root>")

                      3.4详细错误

                      确定是否应捕获详细错误。启用(或当环境设置为Development)时,应用捕获详细的异常(环境变量:ASPNETCORE_DETAILEDERRORS)。

                      WebHost.CreateDefaultBuilder(args) .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

                      3.5环境

                      设置应用程序的环境。环境可以设置为任何值。框架定义的值包括Development、Staging和Production。值不区分大小写。默认情况下,从ASPNETCORE_ENVIRONMENT环境变量读取环境。使用Visual Studio时,可能会在launchSettings.json文件中设置环境变量。有关于环境详情信息,可以移步到Core系列第10章节有参阅(环境变量:ASPNETCORE_ENVIRONMENT)。

                      WebHost.CreateDefaultBuilder(args) .UseEnvironment(EnvironmentName.Development)

                      3.6HTTPS端口

                      设置HTTPS重定向端口。用于强制实施HTTPS(环境变量:ASPNETCORE_HTTPS_PORT)。

                      WebHost.CreateDefaultBuilder(args) .UseSetting("localhost:123。使用“*”指示服务器应针对请求侦听的使用特定端口和协议(例如 *:5000)的IP地址或主机名。协议(或)必须包含每个URL。不同的服务器支持的格式有所不同(环境变量:ASPNETCORE_URLS)。

                      WebHost.CreateDefaultBuilder(args) .UseUrls("*:5000;localhost:5001;hostname:5002")

                      4.重写配置

                      使用配置可以配置Web主机。在下面的示例中,主机配置是根据需要在hostsettings.json文件中指定。命令行参数可能会重写从hostsettings.json文件加载的任何配置。生成的配置(在config中)用于通过UseConfiguration配置主机。
                      新建一个hostsettings.json文件,内容如下:

                      { "urls": "*:5005" }

                      public static IWebHostBuilder CreateWebHostBuilder(string[] args) { //IConfigurationBuilder的配置主机 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) //主机配置在hostsettings.json文件中指定 .AddJsonFile("hostsettings.json", optional: true) //输入的命令行参数可能会重写从hostsettings.json文件加载的任何配置 .AddCommandLine(args) .Build(); return WebHost.CreateDefaultBuilder(args) .UseUrls("*:5001") .UseConfiguration(config) .Configure(app => { //生成的配置委托函数 app.Run(context => context.Response.WriteAsync("Hello, World!")); }); }

                      上述代码描述意思是若要指定在特定的URL上运行的主机,所需的值可以在执行dotnet运行时从命令提示符传入。命令行参数重写hostsettings.json文件中的urls值,且服务器侦听端口8080:

                      dotnet run --urls "*:8080"

                      主机启动时,先用hostsettings.json config重写UseUrls提供的urls参数配置,然后再用命令行参数config重写hostsettings.json config的urls参数配置。

                      5.管理主机

                      管理主机启动方式有Run和Start两种。Run方法启动Web应用程序并阻止调用线程,直到关闭主机。Start方法通过调用自身以非阻止方式运行主机。

                      //Run CreateWebHostBuilder(args).Build().Run();

                      //Start:非阻止方式,所有必须加上ReadLine CreateWebHostBuilder(args).Build().Start(); Console.ReadLine();

                      6.IHostingEnvironment接口

                      IHostingEnvironment接口提供有关应用的Web承载环境的信息。使用构造函数注入获取 IHostingEnvironment以使用其属性和扩展方法:

                      //示例1: public class CustomFileReader { private readonly IHostingEnvironment _env; public CustomFileReader(IHostingEnvironment env) { _env = env; } public string ReadFile(string filePath) { var fileProvider = _env.WebRootFileProvider; // Process the file here } }

                      可以用于在启动时基于环境配置应用程序或者将IHostingEnvironment注入到Startup构造函数,用于ConfigureServices:

                      //示例2: public class Startup { public Startup(IHostingEnvironment env) { HostingEnvironment = env; } public IHostingEnvironment HostingEnvironment { get; } public void ConfigureServices(IServiceCollection services) { if (HostingEnvironment.IsDevelopment()) { // Development configuration } else { // Staging/Production configuration } var contentRootPath = HostingEnvironment.ContentRootPath; } }

                      IHostingEnvironment服务还可以直接注入到Configure方法以设置处理管道:

                      //示例3: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { // In Development, use the Developer Exception Page app.UseDeveloperExceptionPage(); } else { // In Staging/Production, route exceptions to /error app.UseExceptionHandler("/error"); } var contentRootPath = env.ContentRootPath; }

                      创建自定义中间件(要了解中间件的同学们,可以移步到第四章节学习)时可以将IHostingEnvironment 注入Invoke方法:

                      public async Task Invoke(HttpContext context, IHostingEnvironment env) { if (env.IsDevelopment()) { // Configure middleware for Development } else { // Configure middleware for Staging/Production } var contentRootPath = env.ContentRootPath; }

                      7.IApplicationLifetime接口

                      IApplicationLifetime允许后启动和关闭活动。接口上的三个属性是用于注册Action方法(用于定义启动和关闭事件)的取消标记。

                      取消标记

                      如何高效配置和管理ASP.NET Core的Web主机?

                      触发条件

                      ApplicationStarted

                      主机已完全启动。

                      ApplicationStopped

                      主机正在完成正常关闭。应处理所有请求。 关闭受到阻止,直到完成此事件。

                      ApplicationStopping

                      主机正在执行正常关闭。仍在处理请求。关闭受到阻止,直到完成此事件。

                      public class Startup { public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime) { appLifetime.ApplicationStarted.Register(OnStarted); appLifetime.ApplicationStopping.Register(OnStopping); appLifetime.ApplicationStopped.Register(OnStopped); Console.CancelKeyPress += (sender, eventArgs) => { appLifetime.StopApplication(); // Don't terminate the process immediately, wait for the Main thread to exit gracefully. eventArgs.Cancel = true; }; } private void OnStarted() { // Perform post-startup activities here } private void OnStopping() { // Perform on-stopping activities here } private void OnStopped() { // Perform post-stopped activities here } }

                      StopApplication是请求应用终止的意思。以下类在调用类的Shutdown方法时使用StopApplication正常关闭应用:

                      public class MyClass { private readonly IApplicationLifetime _appLifetime; public MyClass(IApplicationLifetime appLifetime) { _appLifetime = appLifetime; } public void Shutdown() { _appLifetime.StopApplication(); } }

                      8.作用域验证

                      如果应用环境为“开发(Development)”,则CreateDefaultBuilder将ServiceProviderOptions.ValidateScopes设为true。若将ValidateScopes设为true,默认服务提供应用程序会执行检查来验证以下内容:
                      ●作用域服务不能直接或间接地从根服务提供者解析。
                      ●作用域服务不会直接或间接地注入到单例中(服务的生命周期)。
                      若要始终验证作用域(包括在生命周期环境中验证),请使用主机生成器上的 UseDefaultServiceProvider配置ServiceProviderOptions:

                      WebHost.CreateDefaultBuilder(args) .UseDefaultServiceProvider((context, options) => { options.ValidateScopes = true; })

                      到此这篇关于ASP.NET Core配置和管理Web主机的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。