首页 > 解决方案 > 如何以编程方式确定运行 asp.net 核心的端口

问题描述

ASP.net 核心可以在任意数量的端口上运行,有时应用程序可能通过命令行运行,将传递的端口作为参数,有时在 docker 中运行,80如果Released指定了配置文件,我们如何以编程方式确定 asp.net 的实际端口继续运行?

建议的答案不是答案,因为这需要访问上下文,假设Startup我需要访问此值?

启动设置.json

"Customer": {
  "commandName": "Project",
  "launchBrowser": false,
  "applicationUrl": "https://localhost:5007;http://localhost:5006",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
  }

例如,在下面的代码中

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Service>();

或系统启动过程中的任何地方。

标签: asp.net-core

解决方案


您可以尝试从以下位置获取端口ServerAddressesFeature

public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
{
    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();
    var address = serverAddressesFeature.Addresses.First();
    int port = int.Parse(address.Split(':').Last());


    logger.LogInformation("Listening on the following addresses: " + string.Join(", ", port.ToString()));
}

作为https://github.com/aspnet/Hosting/issues/811

这不适用于 IIS 或 IIS Express。IIS 作为反向代理运行。它为您的进程选择一个随机端口来侦听,并且不会将公共地址信息流向您。获取公共地址信息的唯一方法是通过传入请求。


推荐阅读