我需要获取HostedServices之一内部的ASP.NET Core应用程序的基本URL。
之所以需要它,是因为它向托管它的同一个ASP.NET核心应用程序发出请求(目的是进行预热,以提高对用户的首次调用性能)。
现在,我的解决方案是将基本URL保留在配置文件中或仅保留在托管服务的私有变量中。
但是我认为,有一种方法可以从启动代码中获取它,但是我不知道它的隐藏位置。
有人知道如何获得它吗?
P.S。 -有一些解决方案可以从请求信息中获取它,但是HostedService在完成任何请求之前就已启动。因此,在这种情况下不适合。
答案 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();