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



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

我找到了这段代码:

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第二个是将5600转发到16478的IIS。如何在启动.cs中获得本地主机:5600?

好吧,这个问题有多种解决方案。您的地址是这样的:

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

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

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

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

Url的类型为 UrlHelper。为了简化此方法,您可以创建扩展方法(GetHostname(此UrlHelper url((,然后将其用于控制器或您想要的任何位置。希望对你有帮助

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

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

编辑:我重读了你的问题。您想知道如何在Startup.cs中执行此操作。可以,但回退更少。您唯一的选择是 配置或原始DNS.GetHostName(),这不太理想。相反,在向服务发出任何请求时,请延迟注册 API。这是你有上下文的时候。在此之前,您的服务对琼恩·雪诺一无所知。对您的API的第一个请求可能是健康检查,因此这将启动您在领事的注册。

我使用的解决方案是回退方案中配置和标头的组合。

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

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

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

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

您正在做的是使您的 API 具有无上下文和弹性(更改(,方法是让 API 对"它所在的位置"有一些上下文感知。

当您尝试在 Startup.cs 中获取当前 URL 时会发生这种情况。我以前遇到过这个问题。我所做的作为我的问题的解决方案是。我刚刚在web.config(用于本地(文件和web.release.config(用于实时(中的应用程序设置中声明了自定义设置,如下所示


在 web.config 中

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

In web.release.config

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

在启动中.cs

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

和发布文件中的不同主机。 所以它有帮助的是我可以从web.config获取本地网站中的本地主机URL,从web.release.config获取实时URL。

如果你使用的是 Azure for live。 它会更容易生活(你不需要添加设置web.release.config文件(。 在您的网站应用程序设置中添加应用设置 https://learn.microsoft.com/en-us/azure/app-service/configure-common

如果是 ASP.NET 核心,你可以使用appsettings.json而不是web.config

最新更新