ASP.NET Core基础知识(十一)【Host之Web 主机】
概述
.NET 应用配置和启动主机。 主机负责应用程序启动和生存期管理。 两个主机 API 可供使用:
- Web 主机 – 适用于托管 Web 应用。
- 通用主机(ASP.NET Core 2.1 或更高版本)– 适用于托管非 Web 应用(例如,运行后台任务的应用)。
在未来的版本中,通用主机将适用于托管任何类型的应用,包括 Web 应用。 通用主机最终将取代 Web 主机。
为托管 ASP.NET Core Web 应用,开发人员应使用基于 IWebHostBuilder
的 Web 主机。 为托管非 Web 应用,开发人员应使用基于 HostBuilder
的通用主机。
在 ASP.NET Core 中使用托管服务实现后台任务
了解如何在 ASP.NET Core 中使用托管服务实现后台任务。
在 ASP.NET Core 中使用承载启动程序集
了解如何使用 IHostingStartup
实现从引用或未引用程序集增强 ASP.NET Core 应用。
ASP.NET Core Web 主机
设置主机
创建使用 IWebHostBuilder
实例的主机。 通常在应用的入口点来执行 Main
方法。 在项目模板中,Main
位于 Program.cs
。 典型的 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>();
}
CreateDefaultBuilder
执行下列任务:
- 使用应用的托管配置提供程序将
Kestrel
服务器配置为 Web 服务器。 有关Kestrel
服务器默认选项,请参阅ASP.NET Core 中的 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 集成还配置应用以捕获启动错误
。 有关 IIS 默认选项,请参阅使用 IIS 在 Windows 上托管 ASP.NET Core
。 - 如果应用环境为“开发”,请将
ServiceProviderOptions.ValidateScopes
设为true
。有关详细信息,请参阅作用域验证
。
ConfigureAppConfiguration
、ConfigureLogging
以及 IWebHostBuilder
的其他方法和扩展方法可重写和增强 CreateDefaultBuilder
定义的配置。 下面是一些示例:
ConfigureAppConfiguration
用于指定应用的其他IConfiguration
。 下面的ConfigureAppConfiguration
调用添加委托,以在appsettings.xml
文件中添加应用配置。 可多次调用ConfigureAppConfiguration
。请注意,此配置不适用于主机(例如,服务器 URL 或环境)。 请参阅主机配置
值部分。
WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);})...
- 下面的
ConfigureLogging
调用添加委托,以将最小日志记录级别 (SetMinimumLevel
) 配置为LogLevel.Warning
。 此设置重写CreateDefaultBuilder
在appsettings.Development.json
和appsettings.Production.json
中配置的设置,分别为LogLevel.Debug
和LogLevel.Error
。 可多次调用ConfigureLogging
。
WebHost.CreateDefaultBuilder(args).ConfigureLogging(logging => {logging.SetMinimumLevel(LogLevel.Warning);})...
- 下面调用
ConfigureKestrel
来重写CreateDefaultBuilder
在配置Kestrel
时建立的 30,000,000 字节默认Limits.MaxRequestBodySize
:
WebHost.CreateDefaultBuilder(args).ConfigureKestrel((context, options) =>{options.Limits.MaxRequestBodySize = 20000000;});
内容根确定主机搜索内容文件(如 MVC 视图文件)的位置。 应用从项目的根文件夹启动时,会将项目的根文件夹用作内容根。 这是 Visual Studio
和 dotnet new
模板中使用的默认值。
有关应用配置的详细信息,请参阅 ASP.NET Core 中的配置
。
备注
作为使用静态CreateDefaultBuilder
方法的替代方法,从WebHostBuilder
创建主机是一种受 ASP.NET Core 2.x 支持的方法。 有关详细信息,请参阅 ASP.NET Core 1.x 选项卡。
设置主机时,可以提供配置
和 ConfigureServices
方法。 如果指定 Startup
类,必须定义 Configure
方法。 有关更多信息,请参见ASP.NET Core 中的应用启动
。 多次调用 ConfigureServices
将追加到另一个。 多次调用 WebHostBuilder
上的 Configure
或 UseStartup
将替换以前的设置。
主机配置值
WebHostBuilder
依赖于以下的方法设置主机配置值:
- 主机生成器配置,其中包括格式
ASPNETCORE_{configurationKey}
的环境变量。 例如ASPNETCORE_ENVIRONMENT
。 UseContentRoot
和UseConfiguration
等扩展(请参阅重写配置
部分)。UseSetting
和关联键。 使用UseSetting
设置值时,该值设置为无论何种类型的字符串。
主机使用任何一个选项设置上一个值。 有关详细信息,请参阅下一部分中的重写配置
。
应用程序键(名称)
在主机构造期间调用 UseStartup
或 Configure
时,会自动设置 IHostingEnvironment.ApplicationName
属性。 该值设置为包含应用入口点的程序集的名称。 要显式设置值,请使用WebHostDefaults.ApplicationKey
:
密钥:applicationName
类型:string
默认值:包含应用入口点的程序集的名称。
设置使用:UseSetting
环境变量:ASPNETCORE_APPLICATIONNAME
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.ApplicationKey, "CustomApplicationName")
捕获启动错误
此设置控制启动错误的捕获。
键:captureStartupErrors
类型:布尔型(true
或 1
)
默认值:默认为 false
,除非应用使用 Kestrel 在 IIS 后方运行,其中默认值是 true
。
设置使用:CaptureStartupErrors
环境变量:ASPNETCORE_CAPTURESTARTUPERRORS
当 false
时,启动期间出错导致主机退出。 当 true
时,主机在启动期间捕获异常并尝试启动服务器。
WebHost.CreateDefaultBuilder(args).CaptureStartupErrors(true)
内容根
此设置确定 ASP.NET Core 开始搜索内容文件,如 MVC 视图等。
键:contentRoot
类型:string
默认值:默认为应用程序集所在的文件夹。
设置使用:UseContentRoot
环境变量:ASPNETCORE_CONTENTROOT
内容根也用作 Web 根设置的基路径。 如果路径不存在,主机将无法启动。
WebHost.CreateDefaultBuilder(args).UseContentRoot("c:\\<content-root>")
详细错误
确定是否应捕获详细错误。
键:detailedErrors
类型:布尔型(true
或 1
)
默认值:false
设置使用:UseSetting
环境变量:ASPNETCORE_DETAILEDERRORS
启用(或当环境设置为 Development
)时,应用捕获详细的异常。
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.DetailedErrorsKey, "true")
环境
设置应用的环境。
键:环境
类型:string
默认值:生产
设置使用:UseEnvironment
环境变量:ASPNETCORE_ENVIRONMENT
环境可以设置为任何值。 框架定义的值包括 Development``Staging
和 Production
。 值不区分大小写。 默认情况下,从 ASPNETCORE_ENVIRONMENT
环境变量读取环境。 使用 Visual Studio 时,可能会在 launchSettings.json 文件中设置环境变量。 有关更多信息,请参见在 ASP.NET Core 中使用多个环境
。
WebHost.CreateDefaultBuilder(args).UseEnvironment(EnvironmentName.Development)
承载启动程序集
设置应用的承载启动程序集。
键:hostingStartupAssemblies
类型:string
默认值:空字符串
设置使用:UseSetting
环境变量:ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
承载启动程序集的以分号分隔的字符串在启动时加载。
虽然配置值默认为空字符串,但是承载启动程序集会始终包含应用的程序集。 提供承载启动程序集时,当应用在启动过程中生成其公用服务时将它们添加到应用的程序集加载。
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "assembly1;assembly2")
HTTPS 端口
设置 HTTPS
重定向端口。 用于强制实施 HTTPS
。
键:https_port;类型:字符串;
默认值:未设置默认值。
设置使用:UseSetting
环境变量:ASPNETCORE_HTTPS_PORT
WebHost.CreateDefaultBuilder(args).UseSetting("https_port", "8080")
承载启动排除程序集
承载启动程序集的以分号分隔的字符串在启动时排除。
键:hostingStartupExcludeAssemblies
类型:string
默认值:空字符串
设置使用:UseSetting
环境变量:ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "assembly1;assembly2")
首选承载 URL
指示主机是否应该侦听使用 WebHostBuilder
配置的 URL,而不是使用 IServer
实现配置的 URL。
键:preferHostingUrls
类型:布尔型(true
或 1
)
默认值:true
设置使用:PreferHostingUrls
环境变量:ASPNETCORE_PREFERHOSTINGURLS
WebHost.CreateDefaultBuilder(args).PreferHostingUrls(false)
阻止承载启动
阻止承载启动程序集自动加载,包括应用的程序集所配置的承载启动程序集。 有关更多信息,请参见在 ASP.NET Core 中使用承载启动程序集
。
键:preventHostingStartup
类型:布尔型(true
或 1
)
默认值:false
设置使用:UseSetting
环境变量:ASPNETCORE_PREVENTHOSTINGSTARTUP
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.PreventHostingStartupKey, "true")
服务器 URL
指示 IP 地址或主机地址,其中包含服务器应针对请求侦听的端口和协议。
键:urls
类型:string
默认: http://localhost:5000
设置使用:UseUrls
环境变量:ASPNETCORE_URLS
设置为服务器应响应的以分号分隔 (? 的 URL 前缀列表。 例如 http://localhost:123
。 使用“*”指示服务器应针对请求侦听的使用特定端口和协议(例如 http://*:5000
)的 IP 地址或主机名。 协议(http://
或 https://
)必须包含每个 URL。 不同的服务器支持的格式有所不同。
WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000;http://localhost:5001;https://hostname:5002")
Kestrel
具有自己的终结点配置 API。 有关更多信息,请参见ASP.NET Core 中的 Kestrel Web 服务器实现
。
关闭超时
指定等待 Web 主机关闭的时长。
键:shutdownTimeoutSeconds
类型:int
默认值:5
设置使用:UseShutdownTimeout
环境变量:ASPNETCORE_SHUTDOWNTIMEOUTSECONDS
虽然键使用 UseSetting
接受 int(例如 .UseSetting(WebHostDefaults.ShutdownTimeoutKey, "10")
),但是 UseShutdownTimeout
扩展方法采用TimeSpan
。
在超时时间段中,托管:
- 触发器
IApplicationLifetime.ApplicationStopping
。 - 尝试停止托管服务,对服务停止失败的任何错误进行日志记录。
如果在所有托管服务停止之前就达到了超时时间,则会在应用关闭时会终止剩余的所有活动的服务。 即使没有完成处理工作,服务也会停止。 如果停止服务需要额外的时间,请增加超时时间。
WebHost.CreateDefaultBuilder(args).UseShutdownTimeout(TimeSpan.FromSeconds(10))
启动程序集
确定要在其中搜索 Startup
类的程序集。
键:startupAssembly
类型:string
默认值:应用的程序集
设置使用:UseStartup
环境变量:ASPNETCORE_STARTUPASSEMBLY
按名称(string
)或类型(TStartup
)的程序集可以引用。 如果调用多个 UseStartup
方法,优先选择最后一个方法。
WebHost.CreateDefaultBuilder(args).UseStartup("StartupAssemblyName")
WebHost.CreateDefaultBuilder(args).UseStartup<TStartup>()
Web 根路径
设置应用的静态资产的相对路径。
键:webroot
类型:string
默认值:如果未指定,默认值是“(Content Root)/wwwroot”(如果该路径存在)。 如果该路径不存在,则使用无操作文件提供程序。
设置使用:UseWebRoot
环境变量:ASPNETCORE_WEBROOT
WebHost.CreateDefaultBuilder(args).UseWebRoot("public")
重写配置
配置
可用于配置 Web 主机。 在下面的示例中,主机配置是根据需要在 hostsettings.json 文件中指定。 命令行参数可能会重写从 hostsettings.json 文件加载的任何配置。 生成的配置(在 config
中)用于通过UseConfiguration
配置主机。 IWebHostBuilder
配置会添加到应用配置中,但反之不亦然—ConfigureAppConfiguration
不影响 IWebHostBuilder
配置。
先用 hostsettings.json config 重写 UseUrls
提供的配置,再用命令行参数 config
:
public class Program
{public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args){var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("hostsettings.json", optional: true).AddCommandLine(args).Build();return WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000").UseConfiguration(config).Configure(app =>{app.Run(context => context.Response.WriteAsync("Hello, World!"));});}
}
hostsettings.json:
{urls: "http://*:5005"
}
备注
UseConfiguration
扩展方法当前不能分析由GetSection
返回的配置部分(例如.UseConfiguration(Configuration.GetSection("section"))
。GetSection
方法将配置键筛选到所请求的部分,但将节名称保留在键上(例如section:urls
、section:environment
)。UseConfiguration
方法需要键来匹配WebHostBuilder
键(例如urls
、environment
)。 键上存在的节名称阻止节的值配置主机。 将在即将发布的版本中解决此问题。 有关详细信息和解决方法,请参阅将配置节传入到 WebHostBuilder.UseConfiguration 使用完整的键。
UseConfiguration
只将所提供的IConfiguration
中的密钥复制到主机生成器配置中。 因此,JSON、INI 和 XML 设置文件的设置reloadOnChange: true
没有任何影响。
若要指定在特定的 URL 上运行的主机,所需的值可以在执行dotnet 运行
时从命令提示符传入。 命令行参数重写 hostsettings.json 文件中的 urls
值,且服务器侦听端口 8080:
dotnet run --urls "http://*:8080"
管理主机
运行
Run
方法启动 Web 应用并阻止调用线程,直到关闭主机:
host.Run();
Start
通过调用 Start
方法以非阻止方式运行主机:
using (host)
{host.Start();Console.ReadLine();
}
如果 URL 列表传递给 Start
方法,该列表侦听指定的 URL:
var urls = new List<string>()
{"http://*:5000","http://localhost:5001"
};var host = new WebHostBuilder().UseKestrel().UseStartup<Startup>().Start(urls.ToArray());using (host)
{Console.ReadLine();
}
应用可以使用通过静态便捷方法预配置的 CreateDefaultBuilder
默认值初始化并启动新的主机。 这些方法在没有控制台输出的情况下启动服务器,并使用 WaitForShutdown
等待中断(Ctrl-C/SIGINT 或 SIGTERM):
Start(RequestDelegate app)
从 RequestDelegate
开始:
using (var host = WebHost.Start(app => app.Response.WriteAsync("Hello, World!")))
{Console.WriteLine("Use Ctrl-C to shutdown the host...");host.WaitForShutdown();
}
在浏览器中向 http://localhost:5000
发出请求,接收响应“Hello World!” WaitForShutdown
受到阻止,直到发出中断(Ctrl-C/SIGINT 或 SIGTERM)。 应用显示 Console.WriteLine
消息并等待 keypress 退出。
Start(string url, RequestDelegate app)
从 URL 和 RequestDelegate
开始:
using (var host = WebHost.Start("http://localhost:8080", app => app.Response.WriteAsync("Hello, World!")))
{Console.WriteLine("Use Ctrl-C to shutdown the host...");host.WaitForShutdown();
}
生成与 Start(RequestDelegate app)
相同的结果,除非应用在 http://localhost:8080
上响应。
Start(Action<IRouteBuilder> routeBuilder)
使用 IRouteBuilder
的实例 (Microsoft.AspNetCore.Routing) 用于路由中间件:
using (var host = WebHost.Start(router => router.MapGet("hello/{name}", (req, res, data) => res.WriteAsync($"Hello, {data.Values["name"]}!")).MapGet("buenosdias/{name}", (req, res, data) => res.WriteAsync($"Buenos dias, {data.Values["name"]}!")).MapGet("throw/{message?}", (req, res, data) => throw new Exception((string)data.Values["message"] ?? "Uh oh!")).MapGet("{greeting}/{name}", (req, res, data) => res.WriteAsync($"{data.Values["greeting"]}, {data.Values["name"]}!")).MapGet("", (req, res, data) => res.WriteAsync("Hello, World!"))))
{Console.WriteLine("Use Ctrl-C to shutdown the host...");host.WaitForShutdown();
}
该示例中使用以下浏览器请求:
请求 | 响应 |
---|---|
http://localhost:5000/hello/Martin
|
Hello, Martin! |
http://localhost:5000/buenosdias/Catrina
|
Buenos dias, Catrina! |
http://localhost:5000/throw/ooops!
|
使用“ooops!”字符串引发异常 |
http://localhost:5000/throw
|
使用“Uh oh!”字符串引发异常 |
http://localhost:5000/Sante/Kevin
|
Sante, Kevin! |
http://localhost:5000
|
Hello World! |
WaitForShutdown
受到阻止,直到发出中断(Ctrl-C/SIGINT 或 SIGTERM)。 应用显示 Console.WriteLine
消息并等待 keypress
退出。
StartWith(string url, Action<IApplicationBuilder> app)
使用 URL 和 IRouteBuilder
实例:
using (var host = WebHost.Start("http://localhost:8080", router => router.MapGet("hello/{name}", (req, res, data) => res.WriteAsync($"Hello, {data.Values["name"]}!")).MapGet("buenosdias/{name}", (req, res, data) => res.WriteAsync($"Buenos dias, {data.Values["name"]}!")).MapGet("throw/{message?}", (req, res, data) => throw new Exception((string)data.Values["message"] ?? "Uh oh!")).MapGet("{greeting}/{name}", (req, res, data) => res.WriteAsync($"{data.Values["greeting"]}, {data.Values["name"]}!")).MapGet("", (req, res, data) => res.WriteAsync("Hello, World!"))))
{Console.WriteLine("Use Ctrl-C to shut down the host...");host.WaitForShutdown();
}
生成与 StartWith(Action<IApplicationBuilder> app)
相同的结果,除非应用在 http://localhost:8080
上响应。
StartWith(Action<IApplicationBuilder> app)
提供委托以配置 IApplicationBuilder
:
using (var host = WebHost.StartWith(app => app.Use(next => {return async context => {await context.Response.WriteAsync("Hello World!");};})))
{Console.WriteLine("Use Ctrl-C to shut down the host...");host.WaitForShutdown();
}
在浏览器中向 http://localhost:5000
发出请求,接收响应“Hello World!” WaitForShutdown
受到阻止,直到发出中断(Ctrl-C/SIGINT 或 SIGTERM)。 应用显示 Console.WriteLine
消息并等待 keypress 退出。
StartWith(string url, Action<IApplicationBuilder> app)
提供 URL 和委托以配置 IApplicationBuilder
:
using (var host = WebHost.StartWith("http://localhost:8080", app => app.Use(next => {return async context => {await context.Response.WriteAsync("Hello World!");};})))
{Console.WriteLine("Use Ctrl-C to shut down the host...");host.WaitForShutdown();
}
生成与 StartWith(Action<IApplicationBuilder> app)
相同的结果,除非应用在 http://localhost:8080
上响应。
IHostingEnvironment
接口
IHostingEnvironment 接口
提供有关应用的 Web 承载环境的信息。 使用构造函数注入
获取 IHostingEnvironment
以使用其属性和扩展方法:
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
:
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;}
}
备注
除了IsDevelopment
扩展方法,IHostingEnvironment
提供IsStaging
、IsProduction
和IsEnvironment(string environmentName)
方法。 有关更多信息,请参见在 ASP.NET Core 中使用多个环境
。
IHostingEnvironment
服务还可以直接注入到 Configure
方法以设置处理管道:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment()){// In Development, use the developer exception pageapp.UseDeveloperExceptionPage();}else{// In Staging/Production, route exceptions to /errorapp.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;
}
IApplicationLifetime
接口
IApplicationLifetime
允许后启动和关闭活动。 接口上的三个属性是用于注册 Action
方法(用于定义启动和关闭事件)的取消标记。
取消标记 | 触发条件 |
---|---|
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();}
}
作用域验证
如果应用环境为“开发”,则CreateDefaultBuilder
将ServiceProviderOptions.ValidateScopes
设为 true
。
若将 ValidateScopes
设为 true
,默认服务提供程序会执行检查来验证以下内容:
- 没有从根服务提供程序直接或间接解析到有作用域的服务。
- 未将有作用域的服务直接或间接注入到单一实例。
调用 BuildServiceProvider
时,会创建根服务提供程序。 在启动提供程序和应用时,根服务提供程序的生存期对应于应用/服务的生存期,并在关闭应用时释放。
有作用域的服务由创建它们的容器释放。 如果作用域创建于根容器,则该服务的生存会有效地提升至单一实例,因为根容器只会在应用/服务关闭时将其释放。 验证服务作用域,将在调用 BuildServiceProvider
时收集这类情况。
若要始终验证作用域(包括在生存环境中验证),请使用主机生成器上的UseDefaultServiceProvider
配置ServiceProviderOptions
:
WebHost.CreateDefaultBuilder(args).UseDefaultServiceProvider((context, options) => {options.ValidateScopes = true;})
ASP.NET Core基础知识(十一)【Host之Web 主机】相关推荐
- ASP.NET Core基础知识(三)【依赖关系注入(服务)】
在 ASP.NET Core 依赖注入 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC)的技术. 有关特定于 MVC 控制器中依 ...
- ASP.NET Core 基础知识(十四)错误处理
1 转载于:https://www.cnblogs.com/qtiger/p/11175247.html
- ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单 ...
- ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...
- ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...
- 16第一章 ASP.Net编程基础知识
第一章 ASP.Net编程基础知识 第一章 ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...
- ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...
- ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...
- ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core Identity 迁移数据 - ASP.NET C ...
最新文章
- 网络连接、路由配置等
- 关于阿里巴巴iconfont的使用方法
- dozer bean_使用Dozer框架进行Bean操作
- 二维数组m的元素是4个字符组成的串_串、数组和广义表
- SpringBoot+Redis 搞定搜索栏热搜、不雅文字过滤功能
- SQLMETAL :Linq对象生成
- ECMAScript 6细说转码的常见的几种方案
- 无人机4G数传一站多机模式
- leetcode剑指offer合集+题解
- 如何编辑PDF文件?分享几种编辑PDF文件方法
- AJAX(七)jsonp实战--天气预报
- 搭建iis自己可以别人_自己也可以搭建一台好用实惠的软导一体机!
- 启动Nginx提示:the“ssl“ parameter requires ngx_http_ssl_module in
- Win10_此电脑_多余项目设备和驱动器
- Python 查找字符串内所有字符起始位置
- 网络上经常使用的简单投票代码
- Android加载本地大Bitmap文件,解析出来的Bitmap是整张图片是黑色的
- 应用程序在后台运行,在后台执行startActivity后会强制把界面带到前端解决方案...
- 蓝桥云算法题之棋盘放麦子——Python满分解答
- MySql数据库中,表字段新增,修改,删除