.NET Core 3.1如何在Startup类ConfigureService方法中读取应用URL
解决方案
ASP.NET Core中ConfigureServices执行阶段Web服务器还未完成启动,因此无法直接拿到运行时实际绑定的URL,但可以通过以下两种方式满足需求:
方法1:读取预先配置的启动URL
应用的启动绑定URL默认来源于配置源(appsettings.json的Urls字段、ASPNETCORE_URLS环境变量、命令行参数等),你可以直接在Startup中通过IConfiguration读取:
- 首先在
Startup构造函数中注入并保存IConfiguration实例:
public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } // 省略其他代码 }
- 在
ConfigureServices中直接读取配置的URL:
public void ConfigureServices(IServiceCollection services) { // 读取配置的启动URL,多个URL默认用分号分隔 var configUrls = Configuration["Urls"]; // 后续逻辑 }
注意:该方式读取的是预先配置的启动值,若你配置的是http://*:0这类动态端口规则,或者运行时端口被自动调整,该方式拿到的不是实际运行的地址
方法2:延后获取运行时实际绑定的URL
如果你需要拿到服务器启动后实际监听的URL,可以在注册服务时使用工厂模式,等服务容器构建完成、服务器启动后再获取地址:
using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Hosting.Server.Features; public void ConfigureServices(IServiceCollection services) { // 示例:注册需要用到应用URL的自定义服务 services.AddTransient<IMyCustomService>(serviceProvider => { // 此时服务器已启动,可拿到实际监听地址 var server = serviceProvider.GetRequiredService<IServer>(); var addressFeature = server.Features.Get<IServerAddressesFeature>(); var actualRunUrl = addressFeature?.Addresses.FirstOrDefault(); return new MyCustomService(actualRunUrl); }); }
注意:不要在ConfigureServices执行过程中直接构建临时服务容器去解析IServer拿地址,此时服务器还未启动,地址集合为空
额外说明:如果你的应用部署在IIS、Nginx等反向代理之后,上述方式拿到的是应用内部监听的本地地址,不是公网用户访问的域名地址,公网地址需要你提前在配置中指定,或者从请求的
X-Forwarded-*头中读取。
内容的提问来源于stack exchange,提问作者AnojBestChoices
相关产品推荐
相关产品推荐

