为什么对IWebHostBuilder.Configure()
扩展方法的调用在ASP.NET Core中似乎没有任何作用(在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
。请参阅此处的来源(尽管是旧的(。
这意味着当随后调用UseStartup<Startup>()
时,它会替换先前注册的委托,因此Configure()
中的配置不会执行。
如果将Configure()
放置在UseStartup<>()
之后,则可以进一步确认此行为。在这种情况下,Configure()
将取代UseStartup<>()
,而UseStartup()
不会执行。
关于Configure()
方法的文档实际上暗示了这一点:
// // Summary: // Specify the startup method to be used to configure the web application. //
(回答了我自己的问题,为其他可能会像我一样困惑的人腾出一些时间。(