为什么调用 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()
方法不仅仅是一般的配置方法。它实际上将提供的委托(delegate)注册为 IStartup
在 ServiceCollection
。查看来源(尽管旧)here .
这意味着当 UseStartup<Startup>()
随后被调用,它替换之前注册的委托(delegate),因此 Configure()
中的配置没有执行。
如果您放置Configure()
,可以进一步确认此行为。之后UseStartup<>()
。在这种情况下,Configure()
将取代 UseStartup<>()
,和UseStartup()
不会执行。
关于 Configure()
的文档方法实际上暗示了这一点:
// // Summary: // Specify the startup method to be used to configure the web application. //
(回答我自己的问题,为可能最终像我一样困惑的其他人腾出一些时间。)
关于asp.net-core - IWebHostBuilder.Configure() 未在 ASP.NET Core 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65061960/