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
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();
I was able to do it in the StartUp.cs using the following code:
int Url = new System.Uri(Configuration["urls"]).Port;
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;
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();
}
}
}
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));
}