如何在Startup文件的ConfigureServices方法中提取指定主机名片段
在Startup.ConfigureServices中获取域名的主域部分(api-example)
方法一:通过配置文件指定(推荐)
把部署的域名写入appsettings.json,这样更灵活且不依赖服务器环境:
{ "AppSettings": { "Domain": "www.api-example.com" } }
然后在ConfigureServices中读取并解析:
public void ConfigureServices(IServiceCollection services) { // 读取配置的完整域名 string fullDomain = Configuration["AppSettings:Domain"]; if (!string.IsNullOrEmpty(fullDomain)) { // 拆分域名部分,提取api-example var domainSegments = fullDomain.Split('.'); // 针对www.xxx.com格式,取中间段 string hostName = domainSegments.Length >= 2 ? domainSegments[1] : string.Empty; // 后续可使用hostName变量 } //*** App Settings Services services.AddAppServices(Configuration); //*** Business Services services.AddBusinessServicesCollection(); }
方法二:从服务器绑定地址获取(限特定场景)
如果不想用配置文件,可以通过IServer获取服务器绑定的地址,但注意IIS反向代理场景下,获取的是Kestrel监听地址而非IIS绑定域名,仅适用于直接部署的情况:
using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Server.Kestrel.Core; public void ConfigureServices(IServiceCollection services) { var server = services.BuildServiceProvider().GetRequiredService<IServer>(); var serverAddresses = server.Features.Get<IServerAddressesFeature>()?.Addresses; if (serverAddresses?.Any() == true) { string fullDomain = serverAddresses.First() .Replace("http://", "") .Replace("https://", ""); var domainSegments = fullDomain.Split('.'); string hostName = domainSegments.Length >= 2 ? domainSegments[1] : string.Empty; } //*** App Settings Services services.AddAppServices(Configuration); //*** Business Services services.AddBusinessServicesCollection(); }
关键说明
ConfigureServices是应用启动阶段执行的方法,此时没有请求上下文,无法获取当前请求的动态域名,只能读取部署前配置的固定域名。如果需要根据每个请求的域名动态处理,应在Configure方法的中间件中,或在控制器/服务里注入IHttpContextAccessor获取HttpContext.Request.Host。
内容的提问来源于stack exchange,提问作者fatih
相关产品推荐
相关产品推荐

