.NET Core 6中使用WebApplication.CreateBuilder()时如何排除托管启动程序集?
问题场景
我尝试在.NET Core 6中通过WebApplication.CreateBuilder(...)排除Microsoft.AspNetCore.Watch.BrowserRefresh托管启动程序集,最初写了如下代码:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "Microsoft.AspNetCore.Watch.BrowserRefresh");
但运行时直接抛出异常:
托管启动程序集排除列表从""更改为"Microsoft.AspNetCore.Watch.BrowserRefresh"。不支持使用WebApplicationBuilder.WebHost更改主机配置,请改用WebApplication.CreateBuilder(WebApplicationOptions)。
查看WebApplicationOptions的定义后,发现它仅包含以下属性,完全没有涉及托管启动程序集的配置项:
public string[]? Args { get; init; } public string? EnvironmentName { get; init; } public string? ApplicationName { get; init; } public string? ContentRootPath { get; init; } public string? WebRootPath { get; init; }
我怀疑只要通过WebApplicationBuilder.WebHost修改主机配置就会触发这个错误,也试过找对应的命令行参数、HostingStartup相关属性,但都没找到合适的排除方式,目前纠结是不是要回退到Host.Create*Builder自行构建,但担心会对已完成的应用造成影响。
解决方案
不用回退到旧的构建方式,有几种更稳妥的方案:
方案1:通过环境变量配置
设置环境变量ASPNETCORE_HOSTINGSTARTUP_EXCLUDEASSEMBLIES,值为要排除的程序集名称:
ASPNETCORE_HOSTINGSTARTUP_EXCLUDEASSEMBLIES=Microsoft.AspNetCore.Watch.BrowserRefresh
方案2:通过配置文件配置
在appsettings.json(或对应环境的配置文件)中添加如下配置:
{ "ASPNETCORE_HOSTINGSTARTUP_EXCLUDEASSEMBLIES": "Microsoft.AspNetCore.Watch.BrowserRefresh" }
方案3:提前构建WebHostBuilder再创建WebApplicationBuilder
如果一定要在代码中硬编码配置,可以先创建并配置好WebHostBuilder,再传入WebApplication.CreateBuilder,这样就不会触发异常:
var webHostBuilder = WebHost.CreateDefaultBuilder(args) .UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "Microsoft.AspNetCore.Watch.BrowserRefresh"); var builder = WebApplication.CreateBuilder(webHostBuilder); // 继续你的应用配置逻辑 var app = builder.Build(); // ...
说明
WebApplicationBuilder不允许在创建后修改WebHost的核心配置,所以必须在创建WebApplicationBuilder之前完成这类主机级别的配置,或者通过配置文件/环境变量这种外部方式设置,这样既符合.NET 6+的WebApplication模型设计,又不会破坏现有应用的结构。
内容的提问来源于stack exchange,提问作者Barak Gall

