【问题标题】:ASP.NET Core 2.1 get current web hostname and port in Startup.csASP.NET Core 2.1 在 Startup.cs 中获取当前的 Web 主机名和端口
【发布时间】:2019-03-15 10:03:52
【问题描述】:

我想将我的 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 使用的第一个是 IIS,它将 5600 转发到 16478。如何在 Startup.cs 中获取 localhost:5600?

【问题讨论】:

  • 嗨,我在这里遇到同样的问题。如果我在 IIS 地址中启动为 NULL ..如果我选择项目调试模式已满 .. 有什么帮助吗??
  • 看来这是无法解决的问题。谁会想到:/

标签: c# consul asp.net-core-2.1


【解决方案1】:

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

  1. 地点 URL 是某种配置文件,可以在部署步骤期间更新以拥有正确的 URL。
  2. 应用程序可以获得请求的完整 URL like this,因此在第一次实际请求应用程序后,我们可以获得主机名。

【讨论】:

    【解决方案2】:

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

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

    它返回 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 = url.RequestContext.HttpContext.Request.Headers["X-Forwarded-For"]
    

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

    【讨论】:

      【解决方案3】:

      编辑:我重读了你的问题。您想知道如何在Startup.cs 中执行此操作。你可以,但回退更少。您唯一的选择是配置或原始DNS.GetHostName(),它们不太理想。相反,根据对您的服务的任何请求,懒惰地注册您的 API。这是当你有 context 的时候。在此之前,您的服务对 Jon Snow 一无所知。对您的 API 的第一个请求可能是健康检查,这样您就可以开始向 consul 注册。

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

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

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

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

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

      您正在做的是让您的 API 具有上下文无关性和弹性(更改),方法是让 API 了解“它所在的位置”的上下文。

      【讨论】:

        【解决方案4】:

        当您尝试在 Startup.cs 中获取当前 URL 时会发生这种情况。我以前遇到过这个问题。我为我的问题所做的解决方案是。我刚刚在 web.config(For Local) 文件和 web.release.config(For Live) 中的 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 获取 Live URL。

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

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

        【讨论】:

        • ASP.NET Core 没有 web.config。它使用 appsettings.json。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 2016-05-24
        相关资源
        最近更新 更多