ASP.NET Core 2.1在Startup.cs中获取当前的Web主机名和端口

Gre*_*edy 11 c# consul asp.net-core-2.1

我想将我的WebAPI注册到Consul服务发现中,为此,我应该提供我的WebAPI的URL(例如:http ://service1.com )和运行状况检查端点(http://service1.com/health/check)。如何获得该URL?

我找到了这段代码:

var features = app.Properties["server.Features"] as FeatureCollection;
var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First();               
var uri = new Uri(address);
Run Code Online (Sandbox Code Playgroud)

它返回127.0.0.1:16478而不是localhost:5600。我认为第一个由dotnet.exe使用,第二个是IIS,它将5600转发到16478。如何在Startup.cs中获得localhost:5600?

Pav*_*yan 7

我认为这是不可能的,因为生产中通常有一个反向代理来处理公共地址,并且应用程序本身不应该向公众公开,因此,请注意公共地址。但是可以有一些解决方法:

  1. Place URL 是某种配置文件,可以在部署步骤中更新以获得正确的 URL。
  2. 应用程序可以像这样获取请求的完整 URL ,因此在对应用程序的第一次实际请求之后,我们可以获得主机名。


gol*_*ich 6

嗯,这个问题有多种解决方案。你的地址是这样的:

string myurl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";
Run Code Online (Sandbox Code Playgroud)

它返回 127.0.0.1:16478 而不是 localhost:5600

你没看错,是的。一种来自 IIS,一种来自 dotnet。因此,您在尝试获取正确的 url 时遇到了问题。好的,如果您的服务位于反向代理之后会怎样?https://en.wikipedia.org/wiki/Reverse_proxy

那么您的服务将不会直接暴露在互联网上,但对特定 url 的请求将从反向代理传递到您的服务。此外,您可以配置反向代理以转发指定原始请求来自何处的其他标头。我认为大多数反向代理都在使用X-Forwarded-For(其中一些正在使用X-Original-Host等)。

因此,如果您在 RP 上设置了正确的标头,那么您可以获得如下网址:

url = url.RequestContext.HttpContext.Request.Headers["X-Forwarded-For"]
Run Code Online (Sandbox Code Playgroud)

Url 是 UrlHelper 类型。为了简化此方法,您可以创建扩展方法 (GetHostname(this UrlHelper url)),然后在您的控制器或任何您想要的地方使用它。希望能帮助到你