IWebHostBuilder.Configure() 未在 ASP.NET 核心中执行
IWebHostBuilder.Configure() not executing in ASP.NET Core
为什么对 IWebHostBuilder.Configure()
扩展方法的调用在 ASP.NET 核心(在 3.4.0 版本中有经验)中似乎没有任何作用?
例如在这种情况下:
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder
.UseSerilog( ... )
.Configure(appBuilder => // Doesn't do anything.
appBuilder.UseSerilogRequestLogging( ... ))
.UseStartup<Startup>();
});
这里在Configure()
内部调用了UseSerilogRequestLogging()
,在Startup执行前添加Serilog的请求日志中间件,目的是将其放在请求管道的开头,同时也保持日志相关一处配置。
但是Configure()
字面上什么都不做,中间件也没有加
原因是IWebHostBuilder.Configure()
方法不仅仅是一种通用的配置方法。它实际上在 ServiceCollection
中将提供的委托注册为 IStartup
。查看源代码(虽然旧)here.
意思是后续调用UseStartup<Startup>()
时,会替换之前注册的delegate,因此Configure()
中的配置不会执行。
如果将 Configure()
放在 UseStartup<>()
之后,可以进一步确认此行为。在这种情况下,Configure()
将替换 UseStartup<>()
,而 UseStartup()
将不会执行。
Configure()
方法的文档实际上暗示了这一点:
//
// Summary:
// Specify the startup method to be used to configure the web application.
//
(回答了我自己的问题,为可能最终和我一样困惑的其他人腾出一些时间。)
为什么对 IWebHostBuilder.Configure()
扩展方法的调用在 ASP.NET 核心(在 3.4.0 版本中有经验)中似乎没有任何作用?
例如在这种情况下:
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder
.UseSerilog( ... )
.Configure(appBuilder => // Doesn't do anything.
appBuilder.UseSerilogRequestLogging( ... ))
.UseStartup<Startup>();
});
这里在Configure()
内部调用了UseSerilogRequestLogging()
,在Startup执行前添加Serilog的请求日志中间件,目的是将其放在请求管道的开头,同时也保持日志相关一处配置。
但是Configure()
字面上什么都不做,中间件也没有加
原因是IWebHostBuilder.Configure()
方法不仅仅是一种通用的配置方法。它实际上在 ServiceCollection
中将提供的委托注册为 IStartup
。查看源代码(虽然旧)here.
意思是后续调用UseStartup<Startup>()
时,会替换之前注册的delegate,因此Configure()
中的配置不会执行。
如果将 Configure()
放在 UseStartup<>()
之后,可以进一步确认此行为。在这种情况下,Configure()
将替换 UseStartup<>()
,而 UseStartup()
将不会执行。
Configure()
方法的文档实际上暗示了这一点:
// // Summary: // Specify the startup method to be used to configure the web application. //
(回答了我自己的问题,为可能最终和我一样困惑的其他人腾出一些时间。)