How to determine which port ASP.NET Core 2 is listening on when a dynamic port (0) was specified

前端 未结 5 1134
遇见更好的自我
遇见更好的自我 2020-12-17 20:28

I\'ve got an ASP.NET Core 2.0 app which I intend to run as a stand-alone application. The app should start up and bind to an available port. To achieve this I configure the

相关标签:
5条回答
  • 2020-12-17 21:10

    You can use the Start() method instead of Run() to access IServerAddressesFeature at the right moment:

    IWebHost webHost = new WebHostBuilder()
        .UseKestrel(options => 
             options.Listen(IPAddress.Loopback, 0)) // dynamic port
        .Build();
    
    webHost.Start();
    
    string address = webHost.ServerFeatures
        .Get<IServerAddressesFeature>()
        .Addresses
        .First();
    int port = int.Parse(address.Split(':').Last());
    
    webHost.WaitForShutdown();
    
    0 讨论(0)
  • 2020-12-17 21:11

    I was able to do it in the StartUp.cs using the following code:

    int Url = new System.Uri(Configuration["urls"]).Port;
    
    0 讨论(0)
  • 2020-12-17 21:14

    I'm able to do it using reflection (ugh!). I've registered an IHostedService and injected IServer. The ListenOptions property on KestrelServerOptions is internal, therefore I need to get to it using reflection. When the hosted service is called I then extract the port using the following code:

    var options = ((KestrelServer)server).Options;
    var propertyInfo = options.GetType().GetProperty("ListenOptions", BindingFlags.Instance | BindingFlags.NonPublic);
    var listenOptions = (List<ListenOptions>)propertyInfo.GetValue(options);
    var ipEndPoint = listenOptions.First().IPEndPoint;
    var port = ipEndPoint.Port;
    
    0 讨论(0)
  • 2020-12-17 21:21

    At least from .Net Core 3 you can inject IServer and get the information.

    using System;
    using System.Linq;
    using Microsoft.AspNetCore.Hosting.Server;
    using Microsoft.AspNetCore.Hosting.Server.Features;
    
    namespace MyApp.Controllers
    {
        public class ServerInfoController : Controller
        {
            public ServerInfoController (IServer server)
            {
                var addresses = server.Features.Get<IServerAddressesFeature>()?.Addresses?.ToArray();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-17 21:23

    You can achive it in Startup class in method Configure. You can get port from ServerAddressesFeature

    Here is an example of code:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ILogger<Startup> logger)
    {
         var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();
    
         loggerFactory.AddFile("logs/myfile-{Date}.txt", minimumLevel: LogLevel.Information, isJson: false);
    
         logger.LogInformation("Listening on the following addresses: " + string.Join(", ", serverAddressesFeature.Addresses));
    }
    
    0 讨论(0)
提交回复
热议问题