如何基于appsettings.json配置Windows服务运行的ASP.NET Core 2 Web API监听URL
在Windows服务的ASP.NET Core 2 Web API中获取IConfiguration并设置监听URL
老哥,这个需求我之前做类似项目时也碰到过,其实实现起来并不复杂,下面给你一步步捋清楚:
第一步:确保appsettings.json能被服务访问到
首先得保证你的appsettings.json文件在服务运行时能被找到。在Visual Studio里右键这个文件,选择「属性」,把「复制到输出目录」改成如果较新则复制或者始终复制——不然服务运行时会找不到配置文件,白忙活一场。
第二步:获取IConfiguration的两种常用方式
ASP.NET Core 2的默认主机构建器已经会自动加载appsettings.json,你可以通过两种方式拿到IConfiguration实例:
方式1:直接构建配置根(适合启动阶段读取配置)
这种方式适合在启动时就需要读取配置的场景(比如设置监听URL),代码示例如下:
using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; namespace YourApiProject { public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().RunAsService(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) // 启用Windows服务支持(需先安装NuGet包:Microsoft.AspNetCore.Hosting.WindowsServices) .UseWindowsService() // 从配置读取并设置监听URL .UseUrls(GetListenUrlsFromConfig()) .UseStartup<Startup>(); private static string GetListenUrlsFromConfig() { // 构建配置根,读取appsettings.json var configBuilder = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfiguration config = configBuilder.Build(); // 返回配置里的监听URL,节点路径要和你appsettings里的对应 return config["ApiSettings:ListenUrls"]; } } }
方式2:利用主机上下文的Configuration(更简洁)
WebHost.CreateDefaultBuilder会自动初始化配置,你可以直接通过主机上下文获取,代码更清爽:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { // 这里可以额外添加配置源,比如环境变量、命令行参数等 // 默认已经加载了appsettings.json和对应环境的配置文件 }) .UseWindowsService() // 直接从主机上下文的Configuration读取URL .UseUrls(hostingContext.Configuration["ApiSettings:ListenUrls"]) .UseStartup<Startup>();
第三步:配置appsettings.json的监听URL
在你的appsettings.json里添加对应的配置节点,比如:
{ "ApiSettings": { "ListenUrls": "http://0.0.0.0:5000;https://0.0.0.0:5001" } }
这里可以设置多个URL,用分号分隔,比如同时监听HTTP和HTTPS,或者监听所有网卡的端口。
额外注意事项
- 别忘了安装Windows服务支持的NuGet包:
Microsoft.AspNetCore.Hosting.WindowsServices,不然RunAsService()和UseWindowsService()方法会找不到。 - 如果你的服务需要监听80、443这类系统端口,要确保服务运行的账号有对应的权限,不然会启动失败。
内容的提问来源于stack exchange,提问作者Nicolas Boisvert
相关产品推荐
相关产品推荐

