.net5获取当前服务地址和端口;IServerAddressesFeature;.net core获取自身服务器地址;.net5获取自身服务器地址


使用.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,那么将不再设置该服务器,并且在未配置地址时应添加默认值

参考:

在dotnet.exe下运行时,IServerAddressesFeature地址为空

https://www.thinbug.com/q/48546843


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM