.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