使用.net5配置consul时,使用dotnet run或者ctrl+F5运行项目,可以获取到配置的服务地址,使用IIS Express获取不到:
解决办法是features.Get<IServerAddressesFeature>()获取不到地址的时候手动指定一个地址,地址通过consul的json文件中配置DefaultAddress:
{
"ConsulAddress": "http://127.0.0.1:8500",
"ServiceName": "Genesis.Api",
"HealthCheck": "/Health",
"DefaultAddress": "http://localhost:9000"
}
获取不到address 的情况下指定DefaultAddress注册服务即可
var features = app.Properties["server.Features"] as FeatureCollection;
var serverFeatures = features.Get<IServerAddressesFeature>();
var address = serverFeatures.Addresses.FirstOrDefault();
if (serverFeatures.Addresses.Count==0)
{
address = serviceOptions.DefaultAddress;
}
var uri = new Uri(address);
另外在非控制器流程获取自身服务器地址例子:
services中:
services.AddSingleton(serviceProvider => { var server = serviceProvider.GetRequiredService<IServer>(); return server.Features.Get<IServerAddressesFeature>(); });
IApplicationBuilder 中:
var features = app.Properties["server.Features"] as FeatureCollection;
var serverFeatures = features.Get<IServerAddressesFeature>();
var address = serverFeatures.Addresses.FirstOrDefault();
获取不到address是由于2017年3月对Kestrel所做的更改。来自announcement:
当未明确配置地址时,托管不再添加默认服务器地址
当没有指定时,WebHost将不再向http://localhost:5000
添加IServerAddressesFeature
的默认服务器地址。现在,默认服务器地址的配置将由服务器负责。
IServerAddressesFeature
中指定的地址在没有直接指定显式地址时,服务器将使用这些地址作为后备。
有一个如何在Hosting no longer adds default server address when no address is explicitly configured中处理此问题的示例:
如果您正在实施服务器并依赖托管设置的IServerAddressesFeature
,那么将不再设置该服务器,并且在未配置地址时应添加默认值
参考: