IWebHostBuilder.Configure()未在ASP.NET Core中执行



为什么对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.
//

(回答了我自己的问题,为其他可能会像我一样困惑的人腾出一些时间。(

最新更新