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.
//

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