使用Host.CreateDefaultBuilder启动时遇短开关未定义异常求助
异常原因及解决方法:System.FormatException: '短开关未在开关映射中定义。'
异常原因
Host.CreateDefaultBuilder默认会自动加载命令行配置源,并遵循默认解析规则:
- 单横线
-开头的内容被识别为短开关(仅作为开关标识,不携带值,比如-l) - 双横线
--开头的内容被识别为带值参数(比如--language=de)
你的启动配置文件中的-l=de被解析器误判为短开关-l,但默认开关映射里没有定义l这个短开关,因此抛出异常。
解决方法
根据应用需求选择以下方案:
方案1:禁用命令行配置源
如果应用不需要解析命令行参数,可清除默认配置源后重新添加所需配置:
_host = Host.CreateDefaultBuilder(e.Args) .ConfigureAppConfiguration((context, config) => { // 清除默认加载的配置源(包括命令行) config.Sources.Clear(); // 设置基础路径并添加自定义配置源 config.SetBasePath(appLocation); config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); // 按需添加其他配置源(如环境变量) }) .ConfigureServices(ConfigureServices) .Build();
方案2:兼容单横线格式的参数
如果需要保留命令行解析能力,可自定义解析规则允许单横线开头的键值对:
_host = Host.CreateDefaultBuilder(e.Args) .ConfigureAppConfiguration((context, config) => { config.SetBasePath(appLocation); // 配置命令行解析,允许单横线作为参数前缀 config.AddCommandLine(e.Args, new CommandLineConfigurationOptions { AllowSingleDash = true }); // 也可手动映射短开关到指定配置键(按需使用) // config.AddCommandLine(e.Args, new Dictionary<string, string> // { // {"-l", "Settings:Language"} // }); }) .ConfigureServices(ConfigureServices) .Build();
方案3:修改参数格式(最简方案)
直接将启动配置中的-l=de改为双横线格式--l=de,符合默认解析规则,无需修改代码。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

