You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:27:50