2017-09-19 8 views
1

J'ai une application ASP.NET Core 2.0 que j'ai l'intention de lancer en tant qu'application autonome. L'application devrait démarrer et se lier à un port disponible. Pour cela, je configure le WebHostBuilder pour écouter sur "http://127.0.0.1:0" et utiliser le serveur Kestrel. Une fois que l'hôte Web commence à écouter, je veux enregistrer l'URL avec le port réel dans un fichier. Je veux le faire le plus tôt possible, car une autre application va lire le fichier pour interagir avec mon application.Comment déterminer quel port ASP.NET Core 2 est à l'écoute lorsqu'un port dynamique (0) a été spécifié

Comment puis-je déterminer le port sur lequel l'hôte Web écoute?

Répondre

1

Je suis capable de le faire en utilisant la réflexion (pouah!). J'ai enregistré un IHostedService et injecté IServer. La propriété "ListenOptions" sur KrestelServerOptions est interne, donc je dois y arriver en utilisant la réflexion. Lorsque le service hébergé est appelé je puis extraire le port en utilisant le code suivant:

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; 
1

Vous pouvez achive en classe de démarrage dans la méthode Configurer. Vous pouvez obtenir le port de ServerAddressesFeature

Voici un exemple de 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)); 
}