在ASP.NET Core HostedService中获取应用程序的基本URL

时间:2018-11-25 18:44:02

标签: asp.net-core

我需要获取HostedServices之一内部的ASP.NET Core应用程序的基本URL。

之所以需要它,是因为它向托管它的同一个ASP.NET核心应用程序发出请求(目的是进行预热,以提高对用户的首次调用性能)。

现在,我的解决方案是将基本URL保留在配置文件中或仅保留在托管服务的私有变量中。

https://github.com/BBGONE/JRIApp.Core/blob/master/DEMOS/RIAppDemoMVC/RIAppDemo/Utils/WarmUpService.cs

但是我认为,有一种方法可以从启动代码中获取它,但是我不知道它的隐藏位置。

有人知道如何获得它吗?

P.S。 -有一些解决方案可以从请求信息中获取它,但是HostedService在完成任何请求之前就已启动。因此,在这种情况下不适合。

1 个答案:

答案 0 :(得分:1)

我已经找到了如何获取申请地址。

public void Configure(IApplicationBuilder application)
{
    var addresses = application.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
}

尽管它存在问题https://github.com/aspnet/Hosting/issues/811,但是如果应用程序托管在IIS或IIS Express中,则无法使用。

他们说:

  

这不适用于IIS或IIS Express。 IIS作为   反向代理。它选择一个随机端口供您的进程监听   并且不会将公共地址信息传递给您。唯一的办法   从传入请求中获取公共地址信息。

ASP.NET Core模块生成一个动态端口以分配给后端进程。 CreateDefaultBuilder调用UseIISIntegration方法。 UseIISIntegration将Kestrel配置为在本地IP地址(127.0.0.1)的动态端口上进行侦听。如果动态端口是1234,则Kestrel侦听127.0.0.1:1234。此配置替代了由的其他URL配置。

但是,如果在构建WebHost后从WebHost获得该功能,则可以使用该功能获取本地地址进行预热。

我尝试过这种方式:

 public static void Main(string[] args)
 {
            var builder = CreateWebHostBuilder(args);
            var webHost = builder.Build();
            var addresses = webHost.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
            var address = addresses.FirstOrDefault();
            AppDomain.CurrentDomain.SetData("BaseUrl", address?? "");
            webHost.Run();
  }

并在WarmUpService中获得本地Kestrel地址,如下所示:

string baseUrl = AppDomain.CurrentDomain.GetData("BaseUrl").ToString();