使用.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
,那么將不再設置該服務器,並且在未配置地址時應添加默認值
參考: