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

时间:2018-10-10 13:15:20

标签: 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);

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

4 个答案:

答案 0 :(得分:4)

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

  1. 位置URL是一种配置文件,可以在部署步骤中对其进行更新以获取正确的URL。
  2. 应用程序可以获取请求like this的完整URL,因此在对应用程序的第一个实际请求之后,我们可以获取主机名。

答案 1 :(得分:3)

嗯,针对此问题有多种解决方案。您的地址是这样:

string myurl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";
  

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

您说对了,是的。一种来自IIS,另一种来自dotnet。因此,您有一个尝试获取正确网址的问题。好的,如果您的服务落后于反向代理,该怎么办? https://en.wikipedia.org/wiki/Reverse_proxy

那么您的服务将不会直接暴露给Internet,但是对特定URL的请求将从反向代理传递到您的服务。另外,您可以配置反向代理以转发其他标头,这些标头指定了原始请求的来源。我认为大多数反向代理都使用X-Forwarded-For(其中一些代理使用X-Original-Host等)。

因此,如果您在RP上设置了适当的标头,则可以获取如下网址:

url = url.RequestContext.HttpContext.Request.Headers["X-Forwarded-For"]

Url是UrlHelper类型。为了简化此方法,您可以创建扩展方法(GetHostname(此UrlHelper url)),然后在控制器中或任何需要的位置使用它。希望对您有帮助

答案 2 :(得分:0)

编辑:我重新阅读了您的问题。您想在Startup.cs中知道如何执行此操作。可以,但后备较少。您唯一的选择是配置或原始DNS.GetHostName(),这不理想。相反,在对您的服务发出任何请求时,延迟注册您的API。这是您具有上下文的情况。在此之前,您的服务一无所知。对您的API的第一个请求可能是健康检查,因此将开始向领事注册。

我使用的一个解决方案是在后备情况下将配置和标头结合在一起。

首先依靠X-Forwarded-For标头。如果在某些情况下不适用或您需要...,则可以使用配置。

这适用于您的用例发现。就是说,当您出于任何原因(例如,用于JSON API的超媒体或您自己的REST实现)生成链接时,它也可以使用。

当进行重新配置并且您有不需要重新部署的动态配置源时,回退可能很有用。

在ASP.NET Core世界中,您可以创建一个类并将其注入到控制器和服务中。此类将具有一种方法,该方法知道先尝试配置(以查看是否需要重写),然后再尝试X-Forwarded-For标头,如果不合适,则进一步回退到HttpContext.Request以获取相关的URI部分。

您正在做的是通过让API知道“它住在哪里”来使它变得无上下文且具有弹性(可更改)。

答案 3 :(得分:-1)

当您尝试在Startup.cs中获取当前URL时,就会发生这种情况。我以前遇到过这个问题。我为我的问题做的解决方案是。我刚刚在 web.config(本地)文件和 web.release.config(实时)文件的 AppSettings 中声明了自定义设置 喜欢


在web.config中

<appSettings>
    <add key="MyHost" value="http://localhost:5600" />
</appSettings>

在web.release.config中

<appSettings>
    <add key="MyHost" value="http://myLiveURL.com" />
</appSettings>

在startup.cs中

string hostSetting = ConfigurationSettings.AppSettings["MyHost"];

和发行文件中的其他主机。因此,我可以从 web.config 获得本地网站中的Localhost URL,并从web.release.config获得实时URL。

(如果您正在使用Azure直播)。这将使直播更加容易(您无需添加设置web.release.config文件)。在您的网站应用程序设置https://docs.microsoft.com/en-us/azure/app-service/configure-common

中添加应用程序设置
  

对于ASP.NET Core,您可以使用appsettings.json代替web.config