ASP.NET Core 3.1中如何从appsettings读取UrlPrefixes到Program.cs
解决方案:从appsettings读取UrlPrefix配置到HttpSys的UrlPrefixes
你遇到的问题我之前也碰到过,核心就是在UseHttpSys的委托里没法直接访问配置系统。其实只要换用带WebHostBuilderContext参数的ConfigureWebHostDefaults重载,就能轻松拿到配置并传递给HttpSys选项了。下面给你两种实用的实现方式:
方法一:直接读取单个配置项
这种方式最简洁,适合只需要读取单个UrlPrefix的场景:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 改用带hostingContext的重载,直接拿到配置访问入口 .ConfigureWebHostDefaults((hostingContext, webBuilder) => { // 从appsettings里按层级读取UrlPrefix配置 var urlPrefix = hostingContext.Configuration["HttpSysOptions:UrlPrefix"]; webBuilder.UseHttpSys(options => { // 判空后添加到UrlPrefixes,避免空值异常 if (!string.IsNullOrEmpty(urlPrefix)) { options.UrlPrefixes.Add(urlPrefix); } }); webBuilder.UseStartup<Startup>(); }) .UseWindowsService();
方法二:绑定配置到自定义对象(推荐)
如果后续需要扩展更多HttpSys相关配置,这种方式更符合ASP.NET Core的配置规范,扩展性更强:
首先可以根据需求调整appsettings结构,支持单个或多个UrlPrefix:
// 单个前缀(保持你原有配置即可) "HttpSysOptions": { "UrlPrefix": "http://localhost:8099/" } // 或者支持多个前缀(可选) "HttpSysOptions": { "UrlPrefixes": ["http://localhost:8099/", "http://localhost:9099/"] }
然后修改代码,通过配置绑定读取:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults((hostingContext, webBuilder) => { // 创建自定义配置类实例,绑定appsettings里的HttpSysOptions节点 var httpSysConfig = new HttpSysCustomConfig(); hostingContext.Configuration.GetSection("HttpSysOptions").Bind(httpSysConfig); webBuilder.UseHttpSys(options => { // 处理单个前缀 if (!string.IsNullOrEmpty(httpSysConfig.UrlPrefix)) { options.UrlPrefixes.Add(httpSysConfig.UrlPrefix); } // 处理多个前缀(如果配置了的话) if (httpSysConfig.UrlPrefixes?.Any() == true) { foreach (var prefix in httpSysConfig.UrlPrefixes) { options.UrlPrefixes.Add(prefix); } } }); webBuilder.UseStartup<Startup>(); }) .UseWindowsService(); // 自定义配置类,和appsettings里的结构一一对应 public class HttpSysCustomConfig { public string UrlPrefix { get; set; } public List<string> UrlPrefixes { get; set; } }
补充说明
你之前的写法之所以无法访问配置,是因为用的ConfigureWebHostDefaults重载没有提供WebHostBuilderContext参数,导致UseHttpSys内部没法直接拿到配置系统的入口。换成带context的重载后,hostingContext.Configuration就是整个配置系统的访问点,能读取任何你在appsettings里定义的配置项。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

